节点在线、应用在线、配置在线使用令牌查询
|
# æ˜Ÿå°˜ç›‘æŽ§å¹³å°æŽ¥å…¥ API 文档
本文档é¢å‘éž .NET å¹³å°çš„å¼€å‘者,æè¿°å¦‚何通过 HTTP API 接入星尘(Stardust)监控平å°ï¼Œä¸ŠæŠ¥åº”用性能监控(APM)数æ®ã€‚
## 目录
- [概述](/NewLife/Stardust/Blob/master/Doc/#概述)
- [è®¤è¯æµç¨‹](/NewLife/Stardust/Blob/master/Doc/#è®¤è¯æµç¨‹)
- [接å£åˆ—表](/NewLife/Stardust/Blob/master/Doc/#接å£åˆ—表)
- [1. ç™»å½•è®¤è¯ - POST /App/Login](/NewLife/Stardust/Blob/master/Doc/#1-登录认è¯---post-applogin)
- [2. å¿ƒè·³ä¿æ´» - POST /App/Ping](/NewLife/Stardust/Blob/master/Doc/#2-å¿ƒè·³ä¿æ´»---post-appping)
- [3. ä¸ŠæŠ¥ç›‘æŽ§æ•°æ® - POST /Trace/Report](/NewLife/Stardust/Blob/master/Doc/#3-上报监控数æ®---post-tracereport)
- [4. ä¸ŠæŠ¥åŽ‹ç¼©ç›‘æŽ§æ•°æ® - POST /Trace/ReportRaw](/NewLife/Stardust/Blob/master/Doc/#4-上报压缩监控数æ®---post-tracereportraw)
- [æ•°æ®æ¨¡åž‹](/NewLife/Stardust/Blob/master/Doc/#æ•°æ®æ¨¡åž‹)
- [接入æµç¨‹](/NewLife/Stardust/Blob/master/Doc/#接入æµç¨‹)
- [注æ„事项](/NewLife/Stardust/Blob/master/Doc/#注æ„事项)
---
## 概述
星尘监控平å°é€šè¿‡ APM(Application Performance Monitoring)机制,收集应用的链路追踪数æ®ã€‚客户端 SDK 按照固定周期(默认60秒)将本周期内采集到的调用信æ¯è¿›è¡Œæ±‡æ€»ï¼Œç„¶åŽä¸ŠæŠ¥è‡³æ˜Ÿå°˜æœåŠ¡ç«¯ã€‚
**æ ¸å¿ƒæ¦‚å¿µï¼š**
| 概念 | 说明 |
|------|------|
| **Trace(追踪)** | 一次完整的请求链路,由唯一的 `TraceId` æ ‡è¯† |
| **Span(片段)** | 追踪链路ä¸çš„一个æ“作片段,包å«å¼€å§‹/ç»“æŸæ—¶é—´ã€æ ‡ç¾ã€é”™è¯¯ä¿¡æ¯ |
| **Builder(构建器)** | 对åŒåæ“作的èšåˆç»Ÿè®¡ï¼ŒåŒ…嫿€»æ¬¡æ•°ã€é”™è¯¯æ•°ã€è€—æ—¶ç‰ï¼Œå¹¶é™„å¸¦é‡‡æ ·çš„ Span |
| **é‡‡æ ·** | æ¯ä¸ªå‘¨æœŸå†…,æ£å¸¸è¯·æ±‚åªä¿ç•™å°‘釿 ·æœ¬ï¼ˆMaxSamples),异常请求ä¿ç•™æ›´å¤šæ ·æœ¬ï¼ˆMaxErrors) |
---
## è®¤è¯æµç¨‹
```
┌─────────┠┌──────────────â”
│ 客户端 │ │ 星尘æœåŠ¡ç«¯ │
└────┬────┘ └──────┬───────┘
│ 1. POST /App/Login │
│ (AppId + Secret) │
├─────────────────────────────────────►│
│ │
│ 返回 JWT Token + 过期时间 │
│◄─────────────────────────────────────┤
│ │
│ 2. POST /App/Ping (æºå¸¦ Token) │
│ (定期心跳,刷新令牌) │
├─────────────────────────────────────►│
│ │
│ 返回新 Token(如å³å°†è¿‡æœŸï¼‰ │
│◄─────────────────────────────────────┤
│ │
│ 3. POST /Trace/Report (æºå¸¦ Token) │
│ (上报监控数æ®) │
├─────────────────────────────────────►│
│ │
│ è¿”å›žé‡‡æ ·å‚æ•°ï¼ˆå‘¨æœŸã€æœ€å¤§æ ·æœ¬æ•°ç‰ï¼‰ │
│◄─────────────────────────────────────┤
```
**Token ä¼ é€’æ–¹å¼ï¼ˆæŒ‰ä¼˜å…ˆçº§ï¼‰ï¼š**
1. URL æŸ¥è¯¢å‚æ•°ï¼š`?Token=xxx`
2. HTTP 请求头:`Authorization: Bearer xxx`
3. HTTP 请求头:`X-Token: xxx`
4. Cookie:`Token=xxx`
---
## 接å£åˆ—表
### 1. ç™»å½•è®¤è¯ - POST /App/Login
客户端å¯åŠ¨æ—¶ï¼Œä½¿ç”¨åº”ç”¨æ ‡è¯†å’Œå¯†é’¥è¿›è¡Œç™»å½•ï¼ŒèŽ·å– JWT 令牌。
**请求:**
```
POST /App/Login
Content-Type: application/json
```
**请求体:**
```json
{
"AppId": "MyApp",
"Secret": "MySecret",
"ClientId": "192.168.1.100@12345",
"AppName": "我的应用",
"NodeCode": "",
"Project": ""
}
```
| å—æ®µ | 类型 | å¿…å¡« | 说明 |
|------|------|------|------|
| `AppId` | String | ✅ | åº”ç”¨æ ‡è¯†ï¼Œåœ¨æ˜Ÿå°˜å¹³å°æ³¨å†Œçš„应用å |
| `Secret` | String | ✅ | 应用密钥 |
| `ClientId` | String | 推è | å®žä¾‹æ ‡è¯†ï¼Œå»ºè®®æ ¼å¼ `IP@进程ID`,用于区分多实例部署 |
| `AppName` | String | å¦ | 应用显示åç§° |
| `NodeCode` | String | å¦ | 节点编ç |
| `Project` | String | å¦ | 项目å |
**å“应体:**
```json
{
"code": 0,
"data": {
"Code": "MyApp",
"Secret": "MySecret",
"Name": "我的应用",
"Token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXdCJ9.xxx.xxx",
"Expire": 7200,
"ServerTime": 1700000000000
}
}
```
| å—æ®µ | 类型 | 说明 |
|------|------|------|
| `code` | Int | 状æ€ç ,0 表示æˆåŠŸ |
| `data.Code` | String | åº”ç”¨æ ‡è¯†ï¼ˆå¯èƒ½è¢«æœåŠ¡ç«¯ä¿®æ£ï¼‰ |
| `data.Secret` | String | åº”ç”¨å¯†é’¥ï¼ˆåŠ¨æ€æ³¨å†Œæ—¶å¯èƒ½æ›´æ–°ï¼‰ |
| `data.Name` | String | 应用åç§° |
| `data.Token` | String | JWT 访问令牌,åŽç»è¯·æ±‚使用 |
| `data.Expire` | Int | 令牌有效期(秒) |
| `data.ServerTime` | Long | æœåС噍 UTC 时间(毫秒时间戳) |
---
### 2. å¿ƒè·³ä¿æ´» - POST /App/Ping
定期å‘é€å¿ƒè·³ï¼Œä¿æŒåœ¨çº¿çжæ€ã€‚当令牌å³å°†è¿‡æœŸï¼ˆ10分钟内),æœåŠ¡ç«¯ä¼šè‡ªåŠ¨é¢å‘新令牌。
**请求:**
```
POST /App/Ping?Token=xxx
Content-Type: application/json
```
**请求体(AppInfo,å¯é€‰ï¼‰ï¼š**
```json
{
"Id": 12345,
"Name": "MyApp",
"Version": "1.0.0",
"IP": "192.168.1.100",
"MachineName": "server-01",
"UserName": "appuser",
"StartTime": "2024-01-01T08:00:00",
"ProcessorTime": 50000,
"CpuUsage": 0.15,
"WorkingSet": 104857600,
"Threads": 25,
"Handles": 300,
"Connections": 50,
"Time": 1700000000000
}
```
| å—æ®µ | 类型 | 说明 |
|------|------|------|
| `Id` | Int | 进程 ID |
| `Name` | String | 进程åç§° |
| `Version` | String | 应用版本 |
| `IP` | String | 本地 IP åœ°å€ |
| `MachineName` | String | 机器å |
| `UserName` | String | è¿è¡Œç”¨æˆ·å |
| `StartTime` | DateTime | 进程å¯åŠ¨æ—¶é—´ |
| `ProcessorTime` | Long | 处ç†å™¨æ—¶é—´ï¼ˆæ¯«ç§’) |
| `CpuUsage` | Double | CPU 使用率(0~1) |
| `WorkingSet` | Long | 物ç†å†…å˜å 用(å—节) |
| `HeapSize` | Long | å †å¤§å°ï¼ˆå—节) |
| `Threads` | Int | 线程数 |
| `WorkerThreads` | Int | 工作线程数 |
| `IOThreads` | Int | IO 线程数 |
| `Handles` | Int | 奿Ÿ„æ•° |
| `Connections` | Int | 连接数 |
| `GCCount` | Int | GC 次数 |
| `Time` | Long | 本地 UTC 时间(毫秒时间戳) |
**å“应体:**
```json
{
"code": 0,
"data": {
"Time": 1700000000000,
"ServerTime": 1700000000000,
"Period": 60,
"Token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXdCJ9.newtoken.xxx",
"Commands": []
}
}
```
| å—æ®µ | 类型 | 说明 |
|------|------|------|
| `data.Time` | Long | æœåŠ¡å™¨æ—¶é—´ |
| `data.ServerTime` | Long | æœåС噍 UTC 时间(毫秒时间戳) |
| `data.Period` | Int | 心跳间隔(秒) |
| `data.Token` | String | 新令牌(仅当旧令牌å³å°†è¿‡æœŸæ—¶è¿”回) |
| `data.Commands` | Array | 待执行的命令列表 |
> **é‡è¦**:如果å“应ä¸åŒ…å« `Token` å—æ®µä¸”éžç©ºï¼Œå®¢æˆ·ç«¯å¿…须用新 Token æ›¿æ¢æ—§ Token。
---
### 3. ä¸ŠæŠ¥ç›‘æŽ§æ•°æ® - POST /Trace/Report
æ¯ä¸ªé‡‡æ ·å‘¨æœŸç»“æŸåŽï¼Œå°†æ±‡æ€»çš„追踪数æ®ä¸ŠæŠ¥è‡³æœåŠ¡ç«¯ã€‚
**请求:**
```
POST /Trace/Report?Token=xxx
Content-Type: application/json
```
**请求体(TraceModel):**
```json
{
"AppId": "MyApp",
"AppName": "我的应用",
"ClientId": "192.168.1.100@12345",
"Version": "1.0.0",
"Info": {
"Id": 12345,
"Name": "MyApp",
"CpuUsage": 0.15,
"WorkingSet": 104857600,
"Threads": 25,
"Time": 1700000000000
},
"Builders": [
{
"Name": "/api/user/list",
"StartTime": 1700000000000,
"EndTime": 1700000060000,
"Total": 150,
"Errors": 2,
"Cost": 4500,
"MaxCost": 230,
"MinCost": 5,
"Samples": [
{
"Id": "a1b2c3d4e5f6",
"ParentId": "",
"TraceId": "trace-001-abc",
"StartTime": 1700000010000,
"EndTime": 1700000010050,
"Tag": "GET /api/user/list?page=1&size=20",
"Error": ""
}
],
"ErrorSamples": [
{
"Id": "x1y2z3w4v5u6",
"ParentId": "",
"TraceId": "trace-002-def",
"StartTime": 1700000020000,
"EndTime": 1700000020100,
"Tag": "GET /api/user/list?page=999",
"Error": "System.InvalidOperationException: Page out of range"
}
]
},
{
"Name": "SELECT * FROM User",
"StartTime": 1700000000000,
"EndTime": 1700000060000,
"Total": 300,
"Errors": 0,
"Cost": 1200,
"MaxCost": 50,
"MinCost": 2,
"Samples": [],
"ErrorSamples": []
}
]
}
```
#### TraceModel å—æ®µè¯´æ˜Ž
| å—æ®µ | 类型 | å¿…å¡« | 说明 |
|------|------|------|------|
| `AppId` | String | ✅ | åº”ç”¨æ ‡è¯† |
| `AppName` | String | å¦ | 应用显示åç§° |
| `ClientId` | String | å¦ | å®žä¾‹æ ‡è¯†ï¼ˆIP@进程ID) |
| `Version` | String | å¦ | å®¢æˆ·ç«¯ç‰ˆæœ¬å· |
| `Info` | AppInfo | å¦ | 应用性能信æ¯ï¼ˆå‚è§ Ping 请求体) |
| `Builders` | Builder[] | ✅ | è¿½è¸ªæ•°æ®æ•°ç»„ |
#### Builderï¼ˆæž„å»ºå™¨ï¼‰å—æ®µè¯´æ˜Ž
æ¯ä¸ª Builder 代表åŒä¸€ä¸ªæ“作ååœ¨æœ¬é‡‡æ ·å‘¨æœŸå†…çš„èšåˆç»Ÿè®¡æ•°æ®ã€‚
| å—æ®µ | 类型 | å¿…å¡« | 说明 |
|------|------|------|------|
| `Name` | String | ✅ | æ“作å,如 `/api/user/list`ã€`SELECT * FROM User` |
| `StartTime` | Long | ✅ | 周期开始时间(Unix 毫秒时间戳) |
| `EndTime` | Long | ✅ | å‘¨æœŸç»“æŸæ—¶é—´ï¼ˆUnix 毫秒时间戳) |
| `Total` | Int | ✅ | 本周期内该æ“作的总调用次数 |
| `Errors` | Int | ✅ | 本周期内该æ“作的错误次数 |
| `Cost` | Long | ✅ | 本周期内所有调用的总耗时(毫秒) |
| `MaxCost` | Int | ✅ | æœ¬å‘¨æœŸå†…å•æ¬¡è°ƒç”¨çš„æœ€å¤§è€—时(毫秒) |
| `MinCost` | Int | ✅ | æœ¬å‘¨æœŸå†…å•æ¬¡è°ƒç”¨çš„æœ€å°è€—时(毫秒) |
| `Samples` | Span[] | å¦ | æ£å¸¸è¯·æ±‚çš„é‡‡æ ·è¯¦æƒ…ï¼ˆæœ€å¤š MaxSamples æ¡ï¼‰ |
| `ErrorSamples` | Span[] | å¦ | å¼‚å¸¸è¯·æ±‚çš„é‡‡æ ·è¯¦æƒ…ï¼ˆæœ€å¤š MaxErrors æ¡ï¼‰ |
#### Spanï¼ˆç‰‡æ®µï¼‰å—æ®µè¯´æ˜Ž
Span æ˜¯å•æ¬¡è°ƒç”¨çš„详细信æ¯ï¼Œç”¨äºŽé“¾è·¯è¿½è¸ªå’Œé—®é¢˜æŽ’查。
| å—æ®µ | 类型 | å¿…å¡« | 说明 |
|------|------|------|------|
| `Id` | String | ✅ | ç‰‡æ®µå”¯ä¸€æ ‡è¯†ï¼Œéšä¸Šä¸‹æ–‡ä¼ 递,用于建立父å关系 |
| `ParentId` | String | å¦ | çˆ¶çº§ç‰‡æ®µæ ‡è¯†ï¼Œä¸ºç©ºè¡¨ç¤ºæ ¹ç‰‡æ®µ |
| `TraceId` | String | ✅ | è¿½è¸ªæ ‡è¯†ï¼ŒåŒä¸€æ¡è°ƒç”¨é“¾è·¯å…±äº«ç›¸åŒçš„ TraceId |
| `StartTime` | Long | ✅ | 开始时间(Unix 毫秒时间戳) |
| `EndTime` | Long | ✅ | ç»“æŸæ—¶é—´ï¼ˆUnix 毫秒时间戳) |
| `Tag` | String | å¦ | æ•°æ®æ ‡ç¾ï¼Œé™„åŠ ä¿¡æ¯ï¼ˆå¦‚ HTTP URLã€SQL è¯å¥ç‰ï¼‰ |
| `Error` | String | å¦ | 错误信æ¯ï¼ˆå¼‚常消æ¯å’Œå †æ ˆï¼‰ |
**å“应体(TraceResponse):**
```json
{
"code": 0,
"data": {
"Period": 60,
"MaxSamples": 1,
"MaxErrors": 10,
"Timeout": 5000,
"MaxTagLength": 1024,
"RequestTagLength": 1024,
"EnableMeter": true,
"Excludes": ["/health", "/favicon.ico"]
}
}
```
| å—æ®µ | 类型 | 说明 |
|------|------|------|
| `data.Period` | Int | é‡‡æ ·å‘¨æœŸï¼ˆç§’ï¼‰ï¼Œå®¢æˆ·ç«¯åº”æŒ‰æ¤å‘¨æœŸä¸ŠæŠ¥æ•°æ® |
| `data.MaxSamples` | Int | æ¯å‘¨æœŸæ¯æ“作最大æ£å¸¸é‡‡æ ·æ•° |
| `data.MaxErrors` | Int | æ¯å‘¨æœŸæ¯æ“ä½œæœ€å¤§å¼‚å¸¸é‡‡æ ·æ•° |
| `data.Timeout` | Int | è¶…æ—¶é˜ˆå€¼ï¼ˆæ¯«ç§’ï¼‰ï¼Œè¶…è¿‡æ¤æ—¶é—´çš„调用视为异常 |
| `data.MaxTagLength` | Int | Tag å—æ®µæœ€å¤§é•¿åº¦ï¼ˆå—ç¬¦ï¼‰ï¼Œè¶…å‡ºæˆªæ– |
| `data.RequestTagLength` | Int | 请求/å“åº”æ ‡ç¾æœ€å¤§é•¿åº¦ï¼ˆå—符) |
| `data.EnableMeter` | Boolean | æ˜¯å¦æ”¶é›†åº”用性能信æ¯ï¼ˆAppInfo) |
| `data.Excludes` | String[] | éœ€è¦æŽ’é™¤çš„æ“作å列表 |
> å®¢æˆ·ç«¯åº”æ ¹æ®å“应动æ€è°ƒæ•´æœ¬åœ°é‡‡æ ·å‚数。
---
### 4. ä¸ŠæŠ¥åŽ‹ç¼©ç›‘æŽ§æ•°æ® - POST /Trace/ReportRaw
当上报数æ®ï¼ˆJSON)超过 1024 å—节时,建议使用 Gzip 压缩åŽé€šè¿‡æ¤æŽ¥å£ä¸ŠæŠ¥ã€‚
**请求:**
```
POST /Trace/ReportRaw?Token=xxx
Content-Type: application/x-gzip
Content-Length: <压缩åŽå—节数>
Body: <Gzip 压缩åŽçš„ TraceModel JSON å—节æµ>
```
**å¤„ç†æµç¨‹ï¼š**
1. å°† TraceModel åºåˆ—化为 JSON å—符串
2. å°† JSON å—符串编ç 为 UTF-8 å—节数组
3. 对å—节数组进行 Gzip 压缩
4. 以 `application/x-gzip` 内容类型å‘é€
**å“应体与 `/Trace/Report` 相åŒã€‚**
> 如果ä¸ä½¿ç”¨ Gzip 压缩,也å¯ä»¥ç›´æŽ¥å‘é€ JSON åŽŸæ–‡ï¼Œæ¤æ—¶ `Content-Type` ä¸åº”设为 `application/x-gzip`。
---
## æ•°æ®æ¨¡åž‹
### 时间戳说明
æ‰€æœ‰æ—¶é—´å—æ®µå‡ä½¿ç”¨ **Unix 毫秒时间戳**(自 1970-01-01 00:00:00 UTC 起的毫秒数)。
å„è¯è¨€èŽ·å–æ–¹å¼ï¼š
```python
# Python
import time
timestamp_ms = int(time.time() * 1000)
```
```java
// Java
long timestampMs = System.currentTimeMillis();
```
```go
// Go
timestampMs := time.Now().UnixMilli()
```
```javascript
// JavaScript
const timestampMs = Date.now();
```
```php
// PHP
$timestampMs = intval(microtime(true) * 1000);
```
### TraceId 与 SpanId 生æˆ
- **TraceId**:建议使用 UUID æˆ–éšæœºå—符串,åŒä¸€è°ƒç”¨é“¾è·¯å†…所有 Span 共享
- **SpanId(Id)**:æ¯ä¸ª Span çš„å”¯ä¸€æ ‡è¯†ï¼Œå»ºè®®ä½¿ç”¨ UUID æˆ–éšæœºå—符串
- **ParentId**:指å‘父级 Span çš„ Idï¼Œæ ¹ Span çš„ ParentId 为空å—符串
```
TraceId: "abc123"
├── Span(Id="s1", ParentId="") â† æ ¹ Span: HTTP 请求
│ ├── Span(Id="s2", ParentId="s1") ↠å Span: æ•°æ®åº“查询
│ └── Span(Id="s3", ParentId="s1") ↠å Span: Redis 缓å˜
│ └── Span(Id="s4", ParentId="s3") â† å™ Span: åºåˆ—化
```
### ClientId æ ¼å¼
`ClientId` ç”¨äºŽæ ‡è¯†åº”ç”¨å®žä¾‹ï¼ŒæŽ¨èæ ¼å¼ä¸º `IP@进程ID`,例如:`192.168.1.100@12345`。
---
## 接入æµç¨‹
### 客户端生命周期
```
1. å¯åЍ → 调用 /App/Login èŽ·å– Token
2. 开始定时心跳(30~60秒)→ 调用 /App/Ping
3. 开始定时采集(默认60秒周期):
a. 收集本周期内所有æ“作的调用数æ®
b. 按æ“作åèšåˆä¸º Builder
c. 对æ¯ä¸ª Builder ä¿ç•™ MaxSamples 个æ£å¸¸æ ·æœ¬å’Œ MaxErrors ä¸ªå¼‚å¸¸æ ·æœ¬
d. 调用 /Trace/Report 或 /Trace/ReportRaw 上报
e. æ ¹æ®å“åº”æ›´æ–°æœ¬åœ°é‡‡æ ·å‚æ•°
4. 退出 → 上报最åŽä¸€æ‰¹æ•°æ®
```
### é‡‡æ ·ç–ç•¥
```
æ¯ä¸ªé‡‡æ ·å‘¨æœŸï¼ˆPeriod 秒)内,对于æ¯ä¸ªæ“作å(Builder.Name):
1. 记录所有调用的统计信æ¯ï¼šæ€»æ¬¡æ•°ã€é”™è¯¯æ•°ã€æ€»è€—æ—¶ã€æœ€å¤§/最å°è€—æ—¶
2. æ£å¸¸è°ƒç”¨åªä¿ç•™ MaxSamples æ¡å®Œæ•´ Span(默认1æ¡ï¼‰
3. 异常调用ä¿ç•™ MaxErrors æ¡å®Œæ•´ Span(默认10æ¡ï¼‰
4. 超过 Timeout 毫秒的调用也视为异常
5. Tag 超过 MaxTagLength å—符时截æ–
```
### 错误处ç†
- **上报失败**:将数æ®åŠ å…¥æœ¬åœ°é˜Ÿåˆ—ï¼Œä¸‹æ¬¡æˆåŠŸæ—¶é‡è¯•
- **Token 过期**ï¼šé‡æ–°è°ƒç”¨ `/App/Login` èŽ·å–æ–° Token
- **æœåŠ¡ç«¯è¿”å›ž code != 0**ï¼šæ ¹æ®é”™è¯¯ç 处ç†
- `401`:认è¯å¤±è´¥ï¼Œé‡æ–°ç™»å½•
- `403`:应用被ç¦ç”¨æˆ–æ— æƒé™
- `500`:æœåŠ¡ç«¯å†…éƒ¨é”™è¯¯ï¼Œç¨åŽé‡è¯•
---
## 注æ„事项
1. **排除自身调用**ï¼šä¸ŠæŠ¥æŽ¥å£ `/Trace/Report` å’Œ `/Trace/ReportRaw` 的调用本身ä¸åº”被采集,é¿å…递归
2. **æ•°æ®æ—¶æ•ˆ**:æœåŠ¡ç«¯ä¼šæ‹’æ”¶è¿‡æœŸæ•°æ®ï¼ˆé»˜è®¤ä¿ç•™å¤©æ•°ä¹‹å‰ï¼‰å’Œæœªæ¥æ—¶é—´çš„æ•°æ®
3. **æ“作å长度**:Builder çš„ Name å—æ®µæœ‰é•¿åº¦é™åˆ¶ï¼ˆçº¦200å—符),超长会被拒收
4. **Gzip 压缩**:JSON 超过 1024 å—节时建议使用 `/Trace/ReportRaw` 接å£åŽ‹ç¼©ä¸Šä¼
5. **Excludes 过滤**:æœåŠ¡ç«¯è¿”å›žçš„ Excludes 列表ä¸çš„æ“ä½œå,客户端ä¸åº”å†é‡‡é›†
6. **å¿ƒè·³ç»æœŸ**:令牌在过期å‰10分钟内,Ping 接å£ä¼šè‡ªåŠ¨è¿”å›žæ–°ä»¤ç‰Œ
7. **网络异常**:网络ä¸å¯ç”¨æ—¶åº”åœ¨æœ¬åœ°ç¼“å˜æ•°æ®ï¼Œæ¢å¤åŽé‡å‘
|