ServiceStack с мониторингом NewRelic
У кого-нибудь есть пример кода для ServiceStack Api, который успешно сообщает транзакции в NewRelic?
Это не кажется тривиальным - это не происходит из коробки, и добавление RequestFilter
, вызывающее NewRelic.Api.Agent.NewRelic.SetTransactionName
, не меняет этого.
Сервер и приложения, похоже, настроены правильно - другие приложения (ASP WebForms и ASP MVC) на одном сервере IIS сообщают правильно. Мы используем IIS 7.5. Каждое приложение находится в собственном пуле приложений и имеет NewRelic.AppName
в web.config
Ответы
Ответ 1
Я работаю в New Relic.
В дополнение к тому, что сказал @mythz, я хотел подтвердить, что у вас есть пул приложений, настроенный отдельно (так что вы не видите транзакции в одном из ваших других контролируемых пулов) - вы создали Интернет. config с отдельным именем приложения (параметр NewRelic.AppName) для этого пула, не так ли?
Предполагая, что да, и вы видите по крайней мере событие запуска агента в журналах для агента из этого пула, я могу проверить, что мы слышали то же самое от других клиентов, хотя прошло некоторое время с тех пор, как мы в последний раз посещали вопрос. Лучшая автоматическая поддержка ServiceStack находится на горизонте, но у меня нет ETA.
При работе с одним клиентом, испытывающим эту проблему, мы обнаружили, что ServiceStack почему-то вызывал наш агент. Решение, которое сработало для них, заключалось в том, чтобы переопределить реализацию AppHostBase. ServiceStack в проекте и проверить объект, который должен быть выпущен, если это экземпляр New Relic. Они переопределили его в проекте веб-службы AppHost (шаблон AppHost находится в вашем проекте в App_Start\AppHost.cs), например:
public override void Release(object instance)
{
if (instance.GetType().ToString().StartsWith("NewRelic.Agent", StringComparison.CurrentCultureIgnoreCase))
return;
base.Release(instance);
}
Если это не приведет к решению, если вы можете открыть билет поддержки https://support.newrelic.com, мы с вами могли бы работать далее, чтобы отслеживать эти статистические данные или, по крайней мере, получать вас в списке уведомлений, когда мы улучшаем поддержку servicestack.
Ответ 2
Я никогда не использовал NewRelic, но это могло бы помочь, если вы установите имя транзакции как можно раньше в ServiceStack Request Pipeline, например, в RawHttpHandlers в AppHost с:
RawHttpHandlers.Add(httpReq => {
NewRelic.Api.Agent.NewRelic.SetTransactionName(
httpReq.HttpMethod, httpReq.AbsoluteUri);
});
или в старом ServiceStack v3 с:
SetConfig(new EndpointHostConfig
{
RawHttpHandlers = {
httpReq => {
NewRelic.Api.Agent.NewRelic.SetTransactionName(
httpReq.HttpMethod, httpReq.AbsoluteUri);
return null;
}
}
});
Ответ 3
В дополнение к дурацкому ответу (если экземпляр агента не удаляется SS), если вы хотите, чтобы имена транзакций New Relic соответствовали вашим именам DTO службы, вы можете сделать следующее:
public class NewRelicIntegrationPlugin : IPlugin
{
public void Register(IAppHost appHost)
{
appHost.RequestFilters.Insert(0, RenameNewRelicTransaction);
}
private void RenameNewRelicTransaction(IHttpRequest httpRequest, IHttpResponse httpResponse, object dto)
{
if ( dto != null )
NewRelic.Api.Agent.NewRelic.SetTransactionName("ServiceStack", dto.GetType().Name);
}
}