Skip to content

cHttpServerStatistics 性能统计 ​

简介 ​

cHttpServerStatistics 是 HttpServer 的服务器级性能统计容器,通过 Public Long 字段实现零开销递增——无 Dictionary 查找、无 Property 调用,适合高频热路径埋点。

全局唯一实例,在 cHttpServer.Class_Initialize 中创建,通过两种途径访问:

vb
' 方式一:通过 Server 对象(服务端生命周期内始终可用)
Server.Statistics.TotalRequests

' 方式二:通过请求上下文(控制器/中间件中使用更自然)
ctx.Statistics.TotalRequests

两者指向同一个对象实例,ctx.Statistics 仅在 ProcessHttpRequest 中做了 Set .Statistics = Statistics 引用赋值,无额外开销。

生命周期说明:Statistics 是服务器级单例,cHttpServerContext.ReleaseRequest 和 Release 均不释放此引用。


字段一览 ​

请求统计 ​

字段类型说明
TotalRequestsLong累计请求总数(含正常和异常)
GetRequestsLongGET 请求数
PostRequestsLongPOST 请求数
PutRequestsLongPUT 请求数
DeleteRequestsLongDELETE 请求数
OptionsRequestsLongOPTIONS 请求数
HeadRequestsLongHEAD 请求数
PatchRequestsLongPATCH 请求数
OtherRequestsLong上述以外方法的请求数

方法分类由 IncrementByMethod 内部完成,基于 cHttpServerRequest.EnumRequestMethod 枚举值:

枚举值常量名递增字段
1ReqPostPostRequests
2ReqGetGetRequests
3ReqPutPutRequests
4ReqDeleteDeleteRequests
5ReqOptionsOptionsRequests
6HeadHeadRequests
7PatchPatchRequests
其他—OtherRequests

状态码统计 ​

字段类型说明
Status1xxLong1xx 响应数(Informational)
Status2xxLong2xx 响应数(Success)
Status3xxLong3xx 响应数(Redirection)
Status4xxLong4xx 响应数(Client Error)
Status5xxLong5xx 响应数(Server Error)

状态码区间由 IncrementByStatusCode 内部完成,对传入的实际状态码整除 100 取百位分组。

前提:cHttpServerResponse.StatusCode 字段在 SendHeader 中赋值。如果响应未走到 SendHeader(如连接已断开),StatusCode 为 0,此时不计入任何区间。

连接统计 ​

字段类型说明
TotalConnectionsAcceptedLong累计接受的连接总数
RejectedConnectionsLong因 MaxConnections 限制被拒绝的连接数
PeakConnectionsLong峰值并发连接数
IdleConnectionsCleanedLong因空闲超时被 CleanupIdleConnections 清理的连接数

错误统计 ​

字段类型说明
RequestErrorsLong请求处理异常次数(ProcessHttpRequest 中 EH 路径)
RequestSizeRejectedLong413 Payload Too Large 次数
SSEEntryErrorsLongSSE Entry 失败次数(预留字段,当前版本未埋点)

流量统计 ​

字段类型说明
TotalBytesReceivedLong累计接收字节数
TotalBytesSentLong累计发送字节数

当前状态:字段已预留,尚未在 cClientCallback.OnDataArrival 和 cHttpServerResponse.SendBodyByte 中埋点。高流量场景下精确字节数采集可能影响性能,按需开启。

SSE 统计 ​

字段类型说明
SSEConnectionsAcceptedLongSSE 连接总数

Session 统计 ​

字段类型说明
TotalSessionsCreatedLong累计创建的 Session 总数(仅 Session.HasID 的有效 Session)

时间统计 ​

字段类型说明
StartTimeDate服务器启动时间(Start 方法中赋值为 Now)

计算属性 ​

UptimeSeconds ​

服务器运行时长(秒)。

vb
Public Property Get UptimeSeconds() As Long

若 StartTime = 0(未启动),返回 0。

AverageQPS ​

每秒平均请求数。

vb
Public Property Get AverageQPS() As Double

计算方式:TotalRequests / UptimeSeconds。运行时长为 0 时返回 0。


Friend 方法 ​

以下方法供 cHttpServer 内部调用,外部无需直接使用。

IncrementByMethod ​

按请求方法枚举值递增对应计数器。

vb
Friend Sub IncrementByMethod(ByVal MethodValue As Long)

映射关系见上方"请求统计"章节的枚举值表。

IncrementByStatusCode ​

按实际状态码递增对应区间计数器。

vb
Friend Sub IncrementByStatusCode(ByVal StatusCode As Long)

对 StatusCode \ 100 整除取百位,映射到 Status1xx~Status5xx。

UpdatePeakConnections ​

更新峰值连接数(仅在当前值大于历史峰值时更新)。

vb
Friend Sub UpdatePeakConnections(ByVal CurrentCount As Long)

Reset 方法 ​

重置所有统计计数器为 0,StartTime 重置为 Now。

vb
Public Sub Reset()

示例:

vb
' 每天零点重置统计
Server.Statistics.Reset

埋点位置对照表 ​

触发位置统计字段说明
ConnectionRequest 事件TotalConnectionsAccepted, PeakConnections, RejectedConnections新连接接入时
Start 方法StartTime = Now服务器启动时记录时间基线
413 路径(请求体超限)RequestSizeRejectedOnDataArrival 检测超限
SSE Entry 路径SSEConnectionsAcceptedSSE 长连接建立时
Router.Entry 之后TotalRequests, IncrementByMethod, IncrementByStatusCode路由完成后统计
Session.HasID 为 TrueTotalSessionsCreated有效 Session 创建时
EH 错误处理路径RequestErrors, TotalRequests异常也计入 TotalRequests
CleanupIdleConnectionsIdleConnectionsCleaned定时器或手动清理时

使用示例 ​

监控接口 ​

在控制器中暴露统计数据的 API 端点:

vb
' GET /api/stats
Public Sub GetStats(ctx As cHttpServerContext)
    Dim s As cHttpServerStatistics
    Set s = ctx.Statistics

    Dim result As New Dictionary
    ' 请求指标
    result("total_requests") = s.TotalRequests
    result("get_requests") = s.GetRequests
    result("post_requests") = s.PostRequests

    ' 状态码分布
    result("status_2xx") = s.Status2xx
    result("status_4xx") = s.Status4xx
    result("status_5xx") = s.Status5xx

    ' 连接指标
    result("current_connections") = ctx.Server.Parent.ConnectionCount
    result("peak_connections") = s.PeakConnections
    result("rejected_connections") = s.RejectedConnections

    ' 性能指标
    result("uptime_seconds") = s.UptimeSeconds
    result("average_qps") = s.AverageQPS
    result("request_errors") = s.RequestErrors

    ctx.Response.Json result, 0, "OK"
End Sub

错误率告警 ​

vb
' 在中间件中检查错误率
Public Sub ErrorRateCheck(ctx As cHttpServerContext)
    Dim s As cHttpServerStatistics
    Set s = ctx.Statistics

    If s.TotalRequests > 100 Then
        Dim errorRate As Double
        errorRate = (s.Status5xx + s.RequestErrors) / s.TotalRequests

        If errorRate > 0.1 Then
            ' 5xx + 异常占比超过 10%,记录告警
            Call WriteAlertLog("错误率过高: " & Format(errorRate, "0.00%"))
        End If
    End If
End Sub

运行时间面板 ​

vb
Public Sub Dashboard(ctx As cHttpServerContext)
    Dim s As cHttpServerStatistics
    Set s = ctx.Statistics

    Dim html As String
    html = "<h1>服务器状态</h1>"
    html = html & "<p>运行时间: " & s.UptimeSeconds & " 秒</p>"
    html = html & "<p>总请求: " & s.TotalRequests & "</p>"
    html = html & "<p>平均 QPS: " & Format(s.AverageQPS, "0.00") & "</p>"
    html = html & "<p>峰值连接: " & s.PeakConnections & "</p>"

    ctx.Response.Html html
End Sub

Long 溢出注意事项 ​

VB6 的 Long 类型为 32 位有符号整数,上限 2,147,483,647。

场景QPS溢出时间
低流量10~6.8 年
中流量100~249 天
高流量1,000~24.9 天
极高流量10,000~2.5 天

建议:

  • 高流量场景(QPS > 1000)下,定期调用 Reset 或在达到阈值时记录快照后重置
  • 监控接口读取时先检查 TotalRequests 是否接近上限,接近时主动告警
  • 如需更长区间累计,可在外部维护 Double 类型的累加器,定期从 TotalRequests 读取增量

依赖关系 ​

cHttpServer
  │
  ├── Public Statistics As cHttpServerStatistics    ← 服务器持有实例
  │     ├── Public Long 字段 × 20+
  │     ├── Property Get UptimeSeconds / AverageQPS
  │     ├── Friend Sub IncrementByMethod / IncrementByStatusCode / UpdatePeakConnections
  │     └── Public Sub Reset
  │
  └── ProcessHttpRequest
        └── ctx.Statistics ──→ 同一实例引用

cHttpServerResponse 新增 Public StatusCode As Long 字段,在 SendHeader 中赋值,为 IncrementByStatusCode 提供数据源。


最后更新: 2026-06-13

VB6及其LOGO版权为微软公司所有