如何配置K8s中.NET应用以在New Relic APM面板展示数据
我的.NET应用运行在Kubernetes Pod中,已通过官方文档的Helm命令在DaemonSet中安装了New Relic .NET Agent。当前应用启动后能将日志发送至New Relic的Kubernetes板块,但无法在APM面板查看平均响应时间、错误率等APM数据,也看不到指定的应用名称。
已完成的配置
- 项目中添加NuGet包:
<PackageReference Include="Serilog.AspNetCore" Version="8.0.1" /> <PackageReference Include="Serilog.Sinks.NewRelic" Version="2.0.0" />
- launchSettings.json中添加环境变量:
"ASPNETCORE_ENVIRONMENT": "Development", "CORECLR_ENABLE_PROFILING": "1"
- appsettings.json中配置Serilog:
"Serilog": { "Properties": { "app": "test_api", "Application": "test_api" }, "WriteTo": { "NewRelicLogsSink": { "Name": "NewRelic", "Args": { "applicationName": "test_api" } } } }
- program.cs中创建并使用Serilog日志:
var logger = new LoggerConfiguration() .ReadFrom.Configuration(builder.Configuration, "Serilog") .Enrich.FromLogContext() .CreateLogger(); builder.Logging.ClearProviders(); builder.Logging.AddSerilog(logger);
使用示例:Log.Information("This is get endpoint from test api");
- pod.yaml配置:
apiVersion: v1 kind: Pod metadata: name: test-api-serilog-pod labels: app: test-api-serilog spec: containers: - name: test-api-serilog-container image: test-api-serilog:latest imagePullPolicy: Never ports: - containerPort: 8080 env: - name: ASPNETCORE_ENVIRONMENT value: "Development" - name: CORECLR_ENABLE_PROFILING value: "1" - name: NEW_RELIC_APP_NAME value: "A new test api serilog 2" - name: NEW_RELIC_LOG value: "stdout" - name: NEW_RELIC_APPLICATION_LOGGING_ENABLED value: "true" - name: NEW_RELIC_APPLICATION_LOGGING_FORWARDING_ENABLED value: "true" - name: NEW_RELIC_LICENSE_KEY valueFrom: secretKeyRef: name: newrelic-bundle-newrelic-logging-config key: license
疑问
是否必须在应用容器内安装.NET Agent,还是可配置DaemonSet中的Agent来发送APM数据?
回答
DaemonSet模式的New Relic .NET Agent完全可以用来采集APM数据,不需要在应用容器内单独安装Agent。你当前的问题是缺少了DaemonSet Agent注入所需的关键配置,导致Agent没有正确挂载到应用容器并完成Profiling注入,具体修复步骤如下:
确认Agent注入标签
- 为你的Pod或Deployment添加New Relic要求的注入标签,比如
newrelic-injection: true,这样DaemonSet的Agent才会识别并向你的应用容器注入所需资源。 - 可通过
kubectl get pods test-api-serilog-pod --show-labels确认标签是否存在。
- 为你的Pod或Deployment添加New Relic要求的注入标签,比如
补充Profiling关键环境变量
你仅设置了CORECLR_ENABLE_PROFILING=1,但缺少Agent注入必需的其他变量(这些通常由Agent自动注入,若未自动注入则手动添加到Pod的env中):CORECLR_PROFILER={36032161-FFC0-4B61-B559-F6C5D41BAE5A} CORECLR_PROFILER_PATH=/usr/local/newrelic-dotnet-agent/libNewRelicProfiler.so NEW_RELIC_DOTNET_AGENT_ENABLED=true注:
CORECLR_PROFILER是固定GUID,对应New Relic .NET Agent;CORECLR_PROFILER_PATH需和DaemonSet Agent实际挂载到容器的路径一致。验证Agent挂载与初始化状态
- 执行
kubectl describe pod test-api-serilog-pod,检查应用容器是否存在挂载自New Relic DaemonSet的/usr/local/newrelic-dotnet-agent目录。 - 查看应用容器日志,搜索
New Relic关键词,确认是否出现New Relic .NET Agent initialized类的初始化成功日志。
- 执行
确认APM应用名称配置
检查NEW_RELIC_APP_NAME环境变量是否被应用容器正确读取,Agent初始化日志中会显示识别到的应用名称,可据此确认配置是否生效。
另外需要明确:你当前通过Serilog直接发送日志到New Relic的流程,和APM数据采集是完全独立的——APM数据依赖于Agent的Profiling插桩功能,而非日志Sink,因此即使日志正常发送,只要Agent未正确注入,就不会生成APM数据。
内容的提问来源于stack exchange,提问作者Amit Limbasiya

