server: host: "127.0.0.1" port: 3000 dataDir: "/tmp/probes_data" runtime: maxConcurrentChecks: 20 defaults: interval: "30s" timeout: "10s" http: method: GET maxBodyBytes: "10MB" cmd: maxOutputBytes: "1MB" targets: # ========== HTTP targets ========== - name: "Baidu 首页可用" type: http group: "搜索引擎" http: url: "https://www.baidu.com" expect: status: [200] maxDurationMs: 5000 - name: "JSON API — 完整流水线" type: http group: "后端服务" interval: "1m" timeout: "15s" http: url: "https://httpbin.org/json" headers: Accept: "application/json" expect: headers: Content-Type: contains: "application/json" maxDurationMs: 8000 body: - json: path: "$.slideshow.title" equals: "Sample Slide Show" - json: path: "$.slideshow.slides[0].title" contains: "Wake" - json: path: "$.slideshow.slides[0].type" equals: "all" - regex: '"title"' - name: "HTML 页面 — CSS 选择器" type: http http: url: "https://httpbin.org/html" expect: body: - css: selector: "h1" contains: "Moby-Dick" - css: selector: "body" exists: true - name: "HTML 页面 — XPath 提取节点文本" type: http http: url: "https://httpbin.org/html" expect: body: - xpath: path: "/html/body/h1/text()" contains: "Melville" - name: "POST 接口测试" type: http http: url: "https://httpbin.org/post" method: POST headers: Content-Type: "application/json" body: '{"action":"check","version":1}' expect: status: [200] body: - json: path: "$.json.action" equals: "check" - json: path: "$.json.version" gte: 1 - name: "请求头验证" type: http http: url: "https://httpbin.org/headers" headers: X-Custom-Header: "dial-server" expect: status: [200] body: - json: path: "$.headers.X-Custom-Header" equals: "dial-server" - name: "响应头自定义校验" type: http http: url: "https://httpbin.org/response-headers" headers: accept: "application/json" expect: body: - json: path: "$.Content-Type" equals: "application/json" - name: "多状态码允许" type: http http: url: "https://httpbin.org/status/200" expect: status: [200, 201, 204] - name: "状态码范围匹配" type: http http: url: "https://httpbin.org/status/204" expect: status: ["2xx"] - name: "自签名证书跳过 SSL" type: http http: url: "https://internal.local/health" ignoreSSL: true expect: status: ["2xx"] - name: "跟随重定向" type: http http: url: "https://httpbin.org/redirect/1" maxRedirects: 5 expect: status: [200] # ========== Cmd targets ========== - name: "Bun 版本输出匹配" type: cmd group: "系统检查" cmd: exec: "bun" args: ["--version"] expect: exitCode: [0] stdout: - match: "^\\d+\\.\\d+\\.\\d+" - name: "自定义文本输出" type: cmd cmd: exec: "bun" args: ["-e", "console.log('check ok')"] expect: stdout: - equals: "check ok\n" maxDurationMs: 3000 - name: "脚本执行无 stderr" type: cmd cmd: exec: "bun" args: ["-e", "process.stdout.write('ok')"] expect: exitCode: [0] stderr: - empty: true - name: "日期脚本输出包含年份" type: cmd cmd: exec: "bun" args: ["-e", "console.log(new Date().getFullYear())"] expect: stdout: - match: "^20\\d{2}\n?$" - name: "环境变量覆盖" type: cmd cmd: exec: "bun" args: ["-e", "console.log(process.env.LANG ?? '')"] env: LANG: "C" expect: stdout: - contains: "C" - name: "运行平台非空输出" type: cmd cmd: exec: "bun" args: ["-e", "console.log(process.platform)"] expect: stdout: - match: ".+" - name: "多规则 stdout 顺序校验" type: cmd interval: "5m" cmd: exec: "bun" args: ["-e", "console.log('version: 2.0.1, status: healthy')"] expect: stdout: - contains: "version:" - match: "\\d+\\.\\d+\\.\\d+" - contains: "healthy" - name: "stderr 内容检查" type: cmd cmd: exec: "bun" args: ["-e", "process.stderr.write('simulated error\\n'); process.exit(1)"] expect: exitCode: [1] stderr: - contains: "simulated error"