Распределенная трассировка с Elasti c APM on. NET Core, не HTTP - PullRequest
0 голосов
/ 27 марта 2020

Я заинтересован в использовании Elasti c APM в ядре ASP. NET для отслеживания набора сервисов, которые взаимодействуют по ряду протоколов (HTTP, SQS, SNS). Несмотря на просмотр документации, мне не ясно, как я могу использовать Elasti c APM Publi c API для подключения транзакций друг к другу, которые происходят за пределами HTTP (Elasti автоматически инструктирует HtrapClient для трассировки c APM).

Согласно документации, я должен быть в состоянии сериализовать CurrentTransaction.OutgoingDistributedTracingData на вызывающем устройстве, а затем десериализовать его, чтобы возобновить транзакцию на вызываемом объекте, но, несмотря на реализацию этого шаблона в памяти, в моих следах в Кибане пропущены отрезки от всех, кроме последней транзакции.

// transaction 1
var trans1 = Agent.Tracer.StartTransaction("Dist Trans 2", ApiConstants.TypeRequest);

await trans1.CaptureSpan("step 1 processing", ApiConstants.ActionExec, async () => await Task.Delay(30));

// transaction 2
var trans2 = Agent.Tracer.StartTransaction("Dist Trans 2", ApiConstants.TypeRequest,
    DistributedTracingData.TryDeserializeFromString(trans1.OutgoingDistributedTracingData.SerializeToString()));

await trans2.CaptureSpan("step 2 processing", ApiConstants.ActionExec, async () => await Task.Delay(30));

// transaction 3
var trans3 = Agent.Tracer.StartTransaction("Dist Trans 2", ApiConstants.TypeRequest,
    DistributedTracingData.TryDeserializeFromString(trans2.OutgoingDistributedTracingData.SerializeToString()));

await trans3.CaptureSpan("step 3 processing", ApiConstants.ActionExec, async () => await Task.Delay(30));

trans3.End();

kibana trace dashboard

Мой всплеск реализации можно найти на Github .

1 Ответ

1 голос
/ 27 марта 2020

Вы не заканчиваете trans1 и trans2.

Просто поместите эти 2 строки в точку, где они заканчиваются, и все должно отображаться нормально:

trans1.End();
trans2.End();

Существует CaptureTransaction, который является удобным методом, который может обернуть вас любым кодом и убедиться, что транзакция завершена и все исключения зафиксированы, поэтому вы используете этот метод, и он делает «все» за вас. .

Тогда есть метод StartTransaction - это тот, который вы используете в своем коде - который запускает транзакцию и больше ничего не делает. Преимущество здесь в том, что вы получаете экземпляр ITransaction, который вы можете использовать где угодно и когда угодно. Но в этом случае вам нужно вызвать .End() для него вручную после выполнения транзакции (или кода, который вы хотите захватить).

То же самое с CaptureSpan и StartSpan.

Таким образом, вы использовали CaptureSpan для своих диапазонов, так что те, которые заканчивались автоматически, когда лямбда с Task.Delay заканчивалась, с другой стороны, вы начинали свои транзакции с StartTransaction, но вызывается только .End() в trans3, а не в 2 других транзакциях.

Существует некоторое объяснение с демо здесь - пример кода этой демонстрации: здесь .

...