Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F1430529
NewRelicHandler.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
NewRelicHandler.php
View Options
<?php
declare
(
strict_types
=
1
);
/*
* This file is part of the Monolog package.
*
* (c) Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace
Monolog\Handler
;
use
Monolog\Logger
;
use
Monolog\Utils
;
use
Monolog\Formatter\NormalizerFormatter
;
use
Monolog\Formatter\FormatterInterface
;
/**
* Class to record a log on a NewRelic application.
* Enabling New Relic High Security mode may prevent capture of useful information.
*
* This handler requires a NormalizerFormatter to function and expects an array in $record['formatted']
*
* @see https://docs.newrelic.com/docs/agents/php-agent
* @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security
*/
class
NewRelicHandler
extends
AbstractProcessingHandler
{
/**
* Name of the New Relic application that will receive logs from this handler.
*
* @var ?string
*/
protected
$appName
;
/**
* Name of the current transaction
*
* @var ?string
*/
protected
$transactionName
;
/**
* Some context and extra data is passed into the handler as arrays of values. Do we send them as is
* (useful if we are using the API), or explode them for display on the NewRelic RPM website?
*
* @var bool
*/
protected
$explodeArrays
;
/**
* {@inheritDoc}
*
* @param string|null $appName
* @param bool $explodeArrays
* @param string|null $transactionName
*/
public
function
__construct
(
$level
=
Logger
::
ERROR
,
bool
$bubble
=
true
,
?
string
$appName
=
null
,
bool
$explodeArrays
=
false
,
?
string
$transactionName
=
null
)
{
parent
::
__construct
(
$level
,
$bubble
);
$this
->
appName
=
$appName
;
$this
->
explodeArrays
=
$explodeArrays
;
$this
->
transactionName
=
$transactionName
;
}
/**
* {@inheritDoc}
*/
protected
function
write
(
array
$record
):
void
{
if
(!
$this
->
isNewRelicEnabled
())
{
throw
new
MissingExtensionException
(
'The newrelic PHP extension is required to use the NewRelicHandler'
);
}
if
(
$appName
=
$this
->
getAppName
(
$record
[
'context'
]))
{
$this
->
setNewRelicAppName
(
$appName
);
}
if
(
$transactionName
=
$this
->
getTransactionName
(
$record
[
'context'
]))
{
$this
->
setNewRelicTransactionName
(
$transactionName
);
unset
(
$record
[
'formatted'
][
'context'
][
'transaction_name'
]);
}
if
(
isset
(
$record
[
'context'
][
'exception'
])
&&
$record
[
'context'
][
'exception'
]
instanceof
\Throwable
)
{
newrelic_notice_error
(
$record
[
'message'
],
$record
[
'context'
][
'exception'
]);
unset
(
$record
[
'formatted'
][
'context'
][
'exception'
]);
}
else
{
newrelic_notice_error
(
$record
[
'message'
]);
}
if
(
isset
(
$record
[
'formatted'
][
'context'
])
&&
is_array
(
$record
[
'formatted'
][
'context'
]))
{
foreach
(
$record
[
'formatted'
][
'context'
]
as
$key
=>
$parameter
)
{
if
(
is_array
(
$parameter
)
&&
$this
->
explodeArrays
)
{
foreach
(
$parameter
as
$paramKey
=>
$paramValue
)
{
$this
->
setNewRelicParameter
(
'context_'
.
$key
.
'_'
.
$paramKey
,
$paramValue
);
}
}
else
{
$this
->
setNewRelicParameter
(
'context_'
.
$key
,
$parameter
);
}
}
}
if
(
isset
(
$record
[
'formatted'
][
'extra'
])
&&
is_array
(
$record
[
'formatted'
][
'extra'
]))
{
foreach
(
$record
[
'formatted'
][
'extra'
]
as
$key
=>
$parameter
)
{
if
(
is_array
(
$parameter
)
&&
$this
->
explodeArrays
)
{
foreach
(
$parameter
as
$paramKey
=>
$paramValue
)
{
$this
->
setNewRelicParameter
(
'extra_'
.
$key
.
'_'
.
$paramKey
,
$paramValue
);
}
}
else
{
$this
->
setNewRelicParameter
(
'extra_'
.
$key
,
$parameter
);
}
}
}
}
/**
* Checks whether the NewRelic extension is enabled in the system.
*
* @return bool
*/
protected
function
isNewRelicEnabled
():
bool
{
return
extension_loaded
(
'newrelic'
);
}
/**
* Returns the appname where this log should be sent. Each log can override the default appname, set in this
* handler's constructor, by providing the appname in it's context.
*
* @param mixed[] $context
*/
protected
function
getAppName
(
array
$context
):
?
string
{
if
(
isset
(
$context
[
'appname'
]))
{
return
$context
[
'appname'
];
}
return
$this
->
appName
;
}
/**
* Returns the name of the current transaction. Each log can override the default transaction name, set in this
* handler's constructor, by providing the transaction_name in it's context
*
* @param mixed[] $context
*/
protected
function
getTransactionName
(
array
$context
):
?
string
{
if
(
isset
(
$context
[
'transaction_name'
]))
{
return
$context
[
'transaction_name'
];
}
return
$this
->
transactionName
;
}
/**
* Sets the NewRelic application that should receive this log.
*/
protected
function
setNewRelicAppName
(
string
$appName
):
void
{
newrelic_set_appname
(
$appName
);
}
/**
* Overwrites the name of the current transaction
*/
protected
function
setNewRelicTransactionName
(
string
$transactionName
):
void
{
newrelic_name_transaction
(
$transactionName
);
}
/**
* @param string $key
* @param mixed $value
*/
protected
function
setNewRelicParameter
(
string
$key
,
$value
):
void
{
if
(
null
===
$value
||
is_scalar
(
$value
))
{
newrelic_add_custom_parameter
(
$key
,
$value
);
}
else
{
newrelic_add_custom_parameter
(
$key
,
Utils
::
jsonEncode
(
$value
,
null
,
true
));
}
}
/**
* {@inheritDoc}
*/
protected
function
getDefaultFormatter
():
FormatterInterface
{
return
new
NormalizerFormatter
();
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Sat, May 16, 19:03 (5 h, 29 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
cf/e7/5b8b46a8bb4ef92cd232a351ba39
Default Alt Text
NewRelicHandler.php (6 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment