如何为Java版Azure函数设置Application Insights遥测的parent id与operation id
解决方案
代码不生效的核心原因
你手动实例化TelemetryClient修改上下文,仅对该实例主动上报的自定义遥测生效,Azure Functions运行时自动生成的触发请求遥测读取的是全局激活的遥测上下文,你并没有修改这个全局配置,且没有提前传递func1的trace上下文参数,自然无法串起整条链路。
具体实现步骤
步骤1:func1侧透传trace上下文
由于Blob存储本身不会自动传递链路追踪参数,你需要在func1上传Blob时,将当前链路的operation_id(整个链路的根ID)和request_id(func1的请求ID,作为func2的父ID)存入Blob的自定义元数据:
// func1中获取当前链路参数 OperationContext opCtx = TelemetryConfiguration.getActive().getContext().getOperation(); String rootOperationId = opCtx.getId(); String func1RequestId = opCtx.getParentId() != null ? opCtx.getParentId() : opCtx.getId(); // 上传blob时将上述两个值存入blob元数据,key可自定义,例如x-trace-op-id、x-trace-parent-id
步骤2:func2侧绑定Blob元数据并修改全局遥测上下文
首先在BlobTrigger的参数中绑定Blob元数据,然后在函数执行最开头修改全局遥测上下文,运行时后续生成的所有遥测都会自动继承该配置:
@FunctionName("Create-Thumbnail") @StorageAccount(Config.STORAGE_ACCOUNT_NAME) @BlobOutput(name = "$return", path = "output/{name}") public byte[] generateThumbnail( @BlobTrigger(name = "blob", path = "input/{name}") byte[] content, // 新增绑定获取Blob元数据 @BindingName("Metadata") Map<String, String> blobMetadata, final ExecutionContext context ) { try { // 第一步就修改全局遥测上下文,必须放在所有业务逻辑前 TelemetryConfiguration activeConfig = TelemetryConfiguration.getActive(); OperationContext operationContext = activeConfig.getContext().getOperation(); // 从元数据中取出func1传过来的链路参数,替换当前上下文 operationContext.setId(blobMetadata.get("x-trace-op-id")); operationContext.setParentId(blobMetadata.get("x-trace-parent-id")); return Converter.createThumbnail(content); } catch (Exception e) { e.printStackTrace(); return content; } }
注意事项
- 必须修改全局激活的
TelemetryConfiguration的上下文,不要用手动实例化的TelemetryClient修改 - 上下文修改操作必须放在函数逻辑最开头,避免运行时已经生成请求遥测后修改不生效
- Blob元数据仅支持ASCII字符,若链路ID包含特殊字符需要先做URL编码再存储,func2侧取出后解码即可
内容的提问来源于stack exchange,提问作者codigube
相关产品推荐
相关产品推荐

