gpt4 book ai didi

c# - Azure Function .net core 6 隔离-traceparent (W3C) 关联

转载 作者:行者123 更新时间:2023-12-02 06:12:06 24 4
gpt4 key购买 nike

我正在尝试拥有一个 azure 功能(.net core 6 隔离),我希望在其中连接到应用程序洞察和用户 W3C Traceparent 作为我的关联方法。

我已经安装了 System.Diagnostics.DiagnosticSource (7.0.1)、Microsoft.Azure.Functions.Worker.ApplicationInsights (1.0.0-preview) 并将所需的代码添加到我的 program.cs

.ConfigureFunctionsWorkerDefaults(builder =>
{
builder.AddApplicationInsights()
.AddApplicationInsightsLogger();
})

虽然我看到 Activity.Id 确实包含一个 TraceParent 格式字符串,但如果我发送一个 TraceParent header ,该事件不会获取它,因此,我在应用程序见解中看不到它。此外,响应不会发回traceparent header ...

然后,我被迫创建一个中间件来尝试此操作,我认真地想知道这是否是实现目标的正确方法,因为记住这仅适用于 http 触发器(更喜欢适用于所有人的东西)

public class TraceparentMiddleware : IFunctionsWorkerMiddleware
{
private const string TraceParentPattern = "^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$";

public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
{
try
{
if (await TrySetActivityId(context))
await next(context);
else
{
var req = await context.GetHttpRequestDataAsync();
var res = req!.CreateResponse(HttpStatusCode.BadRequest);
await res.WriteStringAsync("Invalid traceparent format.");
context.GetInvocationResult().Value = res;
}

SetTraceparentHeader(context);
}
catch
{
SetTraceparentHeader(context);
throw; //because I don't know where the app insights code to log the exceptions happens.
}
}

private static async Task<bool> TrySetActivityId(FunctionContext context)
{
var request = await context.GetHttpRequestDataAsync();

if (request?.Headers?.TryGetValues("traceparent", out var values) ?? false && !string.IsNullOrWhiteSpace(values?.FirstOrDefault()))
{
var regex = new Regex(TraceParentPattern, RegexOptions.IgnoreCase);
if (regex.IsMatch(values.FirstOrDefault()))
Activity.Current.GetType()
.GetField("_id", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
.SetValue(Activity.Current, values.FirstOrDefault());
else
return false;
}
return true;
}

private void SetTraceparentHeader(FunctionContext context)
{
var response = context.GetHttpResponseData();
if (!response?.Headers?.Contains("traceparent") ?? false)
response.Headers.Add("traceparent", Activity.Current.Id);
}
}

如您所见...我什至被迫使用反射来设置 Activity.Current.Id,这是我想避免的。

最佳答案

您还可以通过 HttpRequestData.FunctionContext.TraceContext 访问 TraceParent。

看看这是否适合您。

var traceParent = request.FunctionContext.TraceContext.TraceParent

watch 中的traceparent示例。

enter image description here

关于c# - Azure Function .net core 6 隔离-traceparent (W3C) 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75734136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com