You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置K8s中.NET应用以在New Relic APM面板展示数据

问题:.NET应用在Kubernetes中无法通过DaemonSet部署的New Relic .NET Agent采集APM数据

我的.NET应用运行在Kubernetes Pod中,已通过官方文档的Helm命令在DaemonSet中安装了New Relic .NET Agent。当前应用启动后能将日志发送至New Relic的Kubernetes板块,但无法在APM面板查看平均响应时间、错误率等APM数据,也看不到指定的应用名称。

已完成的配置

  1. 项目中添加NuGet包:
<PackageReference Include="Serilog.AspNetCore" Version="8.0.1" />
<PackageReference Include="Serilog.Sinks.NewRelic" Version="2.0.0" />
  1. launchSettings.json中添加环境变量:
"ASPNETCORE_ENVIRONMENT": "Development",
"CORECLR_ENABLE_PROFILING": "1"
  1. appsettings.json中配置Serilog:
"Serilog": {
  "Properties": {
    "app": "test_api",
    "Application": "test_api"
  },
  "WriteTo": {
    "NewRelicLogsSink": {
      "Name": "NewRelic",
      "Args": {
        "applicationName": "test_api"
      }
    }
  }
}
  1. 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");

  1. 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注入,具体修复步骤如下:

  1. 确认Agent注入标签

    • 为你的Pod或Deployment添加New Relic要求的注入标签,比如newrelic-injection: true,这样DaemonSet的Agent才会识别并向你的应用容器注入所需资源。
    • 可通过kubectl get pods test-api-serilog-pod --show-labels确认标签是否存在。
  2. 补充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实际挂载到容器的路径一致。

  3. 验证Agent挂载与初始化状态

    • 执行kubectl describe pod test-api-serilog-pod,检查应用容器是否存在挂载自New Relic DaemonSet的/usr/local/newrelic-dotnet-agent目录。
    • 查看应用容器日志,搜索New Relic关键词,确认是否出现New Relic .NET Agent initialized类的初始化成功日志。
  4. 确认APM应用名称配置
    检查NEW_RELIC_APP_NAME环境变量是否被应用容器正确读取,Agent初始化日志中会显示识别到的应用名称,可据此确认配置是否生效。

另外需要明确:你当前通过Serilog直接发送日志到New Relic的流程,和APM数据采集是完全独立的——APM数据依赖于Agent的Profiling插桩功能,而非日志Sink,因此即使日志正常发送,只要Agent未正确注入,就不会生成APM数据。


内容的提问来源于stack exchange,提问作者Amit Limbasiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:36:11