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

如何将ASP.NET Core中PageModel的所有字段日志到Honeycomb/OpenTelemetry

记录完整PageModel到Honeycomb.io的实现思路

1. 在表单提交Action中直接记录PageModel

ASP.NET Core会自动将用户提交的表单数据绑定到PageModel的属性上,你可以在POST处理方法中直接捕获并发送到Honeycomb:

  • 注入IHoneycombEventSender实例(Honeycomb .NET SDK提供的事件发送器)。
  • 验证模型状态后,将PageModel(或其绑定的表单数据对象)封装到Honeycomb事件中发送,同时标记事件类型方便后续筛选。

示例代码:

public class ProductFormPageModel : PageModel
{
    private readonly IHoneycombEventSender _honeycombSender;

    public ProductFormPageModel(IHoneycombEventSender honeycombSender)
    {
        _honeycombSender = honeycombSender;
    }

    [BindProperty]
    public ProductFormInput FormData { get; set; }

    public async Task<IActionResult> OnPostAsync()
    {
        // 记录模型验证失败的情况(调试用)
        if (!ModelState.IsValid)
        {
            var validationEvent = new Dictionary<string, object>
            {
                ["event_type"] = "form_submission_validation_failed",
                ["form_data"] = FormData,
                ["validation_errors"] = ModelState.Values.SelectMany(v => v.Errors.Select(e => e.ErrorMessage))
            };
            await _honeycombSender.SendEventAsync(validationEvent);
            return Page();
        }

        // 记录成功提交的完整表单数据
        var successEvent = new Dictionary<string, object>
        {
            ["event_type"] = "form_submission_success",
            ["form_data"] = FormData,
            ["submit_timestamp"] = DateTime.UtcNow,
            ["user_agent"] = Request.Headers.UserAgent.ToString()
        };
        await _honeycombSender.SendEventAsync(successEvent);

        // 后续业务逻辑
        return RedirectToPage("/Product/Success");
    }
}

2. 全局捕获500错误时关联PageModel

针对500错误,你可以通过页面过滤器捕获异常,并同时获取当前请求的PageModel:

  • 实现IAsyncPageFilter,在执行页面处理器的环节捕获未处理异常。
  • 将异常详情、PageModel数据、请求路径等信息打包发送到Honeycomb,方便定位错误场景。

示例过滤器代码:

public class HoneycombExceptionFilter : IAsyncPageFilter
{
    private readonly IHoneycombEventSender _honeycombSender;

    public HoneycombExceptionFilter(IHoneycombEventSender honeycombSender)
    {
        _honeycombSender = honeycombSender;
    }

    public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
    {
        var resultContext = await next();
        if (resultContext.Exception != null && !resultContext.ExceptionHandled)
        {
            var pageModel = context.HandlerInstance as PageModel;
            var errorEvent = new Dictionary<string, object>
            {
                ["event_type"] = "form_submission_500_error",
                ["page_model_data"] = pageModel,
                ["exception_message"] = resultContext.Exception.Message,
                ["exception_stacktrace"] = resultContext.Exception.StackTrace,
                ["request_path"] = context.HttpContext.Request.Path
            };
            await _honeycombSender.SendEventAsync(errorEvent);
        }
    }

    public Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
    {
        return Task.CompletedTask;
    }
}

在Program.cs中注册过滤器:

builder.Services.AddRazorPages(options =>
{
    options.Filters.Add<HoneycombExceptionFilter>();
});

3. 关键注意事项

  • 敏感数据过滤:PageModel中若包含密码、手机号等敏感字段,必须通过[JsonIgnore]特性标记排除,或在构造事件时手动移除,避免数据泄露。
  • 性能优化:大对象序列化可能影响响应速度,建议异步发送事件;高频提交的表单可配置Honeycomb采样率,减少不必要的事件发送。
  • 字段结构化:尽量将PageModel的属性拆分为独立的事件字段(比如form_product_id、form_user_email),而非直接序列化整个对象为字符串,这样在Honeycomb中更容易做查询和聚合分析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:52:16