curl --request POST \
--url 'https://api.flashcat.cloud/monit/query/diagnose?app_key=' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"account_id": 10001,
"ds_type": "victorialogs",
"ds_name": "vmlogs-read",
"operation": "log_patterns",
"time_range": {
"start": 1776847544,
"end": 1776849344
},
"methods": [
{
"name": "pattern_snapshot"
},
{
"name": "pattern_compare",
"baseline": "same_window_yesterday"
}
],
"input": {
"query": "_stream:{status='500'}"
},
"options": {
"max_logs_scanned": 10000,
"max_patterns": 20,
"examples_per_pattern": 2,
"timeout_seconds": 25
}
}
EOFimport requests
url = "https://api.flashcat.cloud/monit/query/diagnose?app_key="
payload = {
"account_id": 10001,
"ds_type": "victorialogs",
"ds_name": "vmlogs-read",
"operation": "log_patterns",
"time_range": {
"start": 1776847544,
"end": 1776849344
},
"methods": [
{ "name": "pattern_snapshot" },
{
"name": "pattern_compare",
"baseline": "same_window_yesterday"
}
],
"input": { "query": "_stream:{status='500'}" },
"options": {
"max_logs_scanned": 10000,
"max_patterns": 20,
"examples_per_pattern": 2,
"timeout_seconds": 25
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
account_id: 10001,
ds_type: 'victorialogs',
ds_name: 'vmlogs-read',
operation: 'log_patterns',
time_range: {start: 1776847544, end: 1776849344},
methods: [
{name: 'pattern_snapshot'},
{name: 'pattern_compare', baseline: 'same_window_yesterday'}
],
input: {query: '_stream:{status=\'500\'}'},
options: {
max_logs_scanned: 10000,
max_patterns: 20,
examples_per_pattern: 2,
timeout_seconds: 25
}
})
};
fetch('https://api.flashcat.cloud/monit/query/diagnose?app_key=', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.flashcat.cloud/monit/query/diagnose?app_key=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'account_id' => 10001,
'ds_type' => 'victorialogs',
'ds_name' => 'vmlogs-read',
'operation' => 'log_patterns',
'time_range' => [
'start' => 1776847544,
'end' => 1776849344
],
'methods' => [
[
'name' => 'pattern_snapshot'
],
[
'name' => 'pattern_compare',
'baseline' => 'same_window_yesterday'
]
],
'input' => [
'query' => '_stream:{status=\'500\'}'
],
'options' => [
'max_logs_scanned' => 10000,
'max_patterns' => 20,
'examples_per_pattern' => 2,
'timeout_seconds' => 25
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.flashcat.cloud/monit/query/diagnose?app_key="
payload := strings.NewReader("{\n \"account_id\": 10001,\n \"ds_type\": \"victorialogs\",\n \"ds_name\": \"vmlogs-read\",\n \"operation\": \"log_patterns\",\n \"time_range\": {\n \"start\": 1776847544,\n \"end\": 1776849344\n },\n \"methods\": [\n {\n \"name\": \"pattern_snapshot\"\n },\n {\n \"name\": \"pattern_compare\",\n \"baseline\": \"same_window_yesterday\"\n }\n ],\n \"input\": {\n \"query\": \"_stream:{status='500'}\"\n },\n \"options\": {\n \"max_logs_scanned\": 10000,\n \"max_patterns\": 20,\n \"examples_per_pattern\": 2,\n \"timeout_seconds\": 25\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.flashcat.cloud/monit/query/diagnose?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"account_id\": 10001,\n \"ds_type\": \"victorialogs\",\n \"ds_name\": \"vmlogs-read\",\n \"operation\": \"log_patterns\",\n \"time_range\": {\n \"start\": 1776847544,\n \"end\": 1776849344\n },\n \"methods\": [\n {\n \"name\": \"pattern_snapshot\"\n },\n {\n \"name\": \"pattern_compare\",\n \"baseline\": \"same_window_yesterday\"\n }\n ],\n \"input\": {\n \"query\": \"_stream:{status='500'}\"\n },\n \"options\": {\n \"max_logs_scanned\": 10000,\n \"max_patterns\": 20,\n \"examples_per_pattern\": 2,\n \"timeout_seconds\": 25\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/monit/query/diagnose?app_key=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"account_id\": 10001,\n \"ds_type\": \"victorialogs\",\n \"ds_name\": \"vmlogs-read\",\n \"operation\": \"log_patterns\",\n \"time_range\": {\n \"start\": 1776847544,\n \"end\": 1776849344\n },\n \"methods\": [\n {\n \"name\": \"pattern_snapshot\"\n },\n {\n \"name\": \"pattern_compare\",\n \"baseline\": \"same_window_yesterday\"\n }\n ],\n \"input\": {\n \"query\": \"_stream:{status='500'}\"\n },\n \"options\": {\n \"max_logs_scanned\": 10000,\n \"max_patterns\": 20,\n \"examples_per_pattern\": 2,\n \"timeout_seconds\": 25\n }\n}"
response = http.request(request)
puts response.read_body{
"request_id": "01JZPD1PCDTN5F4YVBD2GS6S9A",
"data": {
"schema_version": "2",
"operation": "log_patterns",
"ds_type": "loki",
"ds_name": "prod-loki",
"query": "{service=\"checkout\"}",
"window": {
"start": "2026-07-14T06:00:00Z",
"end": "2026-07-14T07:00:00Z"
},
"data_handling": {
"log_redaction_applied": true,
"log_redaction_coverage": "best_effort",
"untrusted_data_fields": [
"pattern_template",
"current_window.sources[].value",
"redacted_log_examples[]"
]
},
"results": [
{
"method": "pattern_compare",
"baseline": "previous_window",
"window": {
"start": "2026-07-14T06:00:00Z",
"end": "2026-07-14T07:00:00Z"
},
"baseline_window": {
"start": "2026-07-14T05:00:00Z",
"end": "2026-07-14T06:00:00Z"
},
"summary": {
"current_sample": {
"logs_scanned": 10000,
"patterns_aggregated": 18,
"logs_not_aggregated_due_to_cluster_limit": 0,
"pattern_matching_limited": false,
"truncated": false
},
"baseline_sample": {
"logs_scanned": 8000,
"patterns_aggregated": 20,
"logs_not_aggregated_due_to_cluster_limit": 0,
"pattern_matching_limited": false,
"truncated": false
},
"patterns_aggregated_only_in_baseline_sample": 2,
"aggregated_pattern_evidence_total": 20,
"pattern_evidence_returned": 1,
"pattern_evidence_truncated_by_max_patterns": true,
"evidence_summary": "10 of 20 pattern evidence items are returned."
},
"pattern_evidence": [
{
"pattern_id": "8f1496a85df86ca1",
"pattern_template": "checkout request <*> failed",
"comparison_status": "comparable",
"current_window": {
"count": 12,
"share_of_scanned_logs": 0.0012,
"first_seen": "2026-07-14T06:03:00Z",
"last_seen": "2026-07-14T06:58:00Z",
"observed_severity_counts": {
"error": 12
}
},
"baseline_window": {
"count": 2,
"share_of_scanned_logs": 0.00025,
"first_seen": "2026-07-14T05:11:00Z",
"last_seen": "2026-07-14T05:44:00Z",
"observed_severity_counts": {
"error": 2
}
},
"observations": [
"The current-sample count was 12 and the baseline-sample count was 2."
],
"redacted_log_examples": [
"checkout request <uuid> failed"
]
}
],
"warnings": []
}
]
}
}{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"error": {
"code": "InvalidParameter",
"message": "The specified parameter is not valid."
}
}{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"error": {
"code": "Unauthorized",
"message": "You are unauthorized."
}
}{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"error": {
"code": "RequestTooFrequently",
"message": "Request too frequently."
}
}{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"error": {
"code": "InternalError",
"message": "We encountered an internal error, and it has been reported. Please try again later."
}
}数据源诊断
执行同步诊断查询(Loki/VictoriaLogs 使用 log_patterns,Prometheus 使用 metric_trends)。Flashduty AI SRE 用于日志模式聚类与时间序列趋势分析。长耗时——最长可达 35 秒。
curl --request POST \
--url 'https://api.flashcat.cloud/monit/query/diagnose?app_key=' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"account_id": 10001,
"ds_type": "victorialogs",
"ds_name": "vmlogs-read",
"operation": "log_patterns",
"time_range": {
"start": 1776847544,
"end": 1776849344
},
"methods": [
{
"name": "pattern_snapshot"
},
{
"name": "pattern_compare",
"baseline": "same_window_yesterday"
}
],
"input": {
"query": "_stream:{status='500'}"
},
"options": {
"max_logs_scanned": 10000,
"max_patterns": 20,
"examples_per_pattern": 2,
"timeout_seconds": 25
}
}
EOFimport requests
url = "https://api.flashcat.cloud/monit/query/diagnose?app_key="
payload = {
"account_id": 10001,
"ds_type": "victorialogs",
"ds_name": "vmlogs-read",
"operation": "log_patterns",
"time_range": {
"start": 1776847544,
"end": 1776849344
},
"methods": [
{ "name": "pattern_snapshot" },
{
"name": "pattern_compare",
"baseline": "same_window_yesterday"
}
],
"input": { "query": "_stream:{status='500'}" },
"options": {
"max_logs_scanned": 10000,
"max_patterns": 20,
"examples_per_pattern": 2,
"timeout_seconds": 25
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
account_id: 10001,
ds_type: 'victorialogs',
ds_name: 'vmlogs-read',
operation: 'log_patterns',
time_range: {start: 1776847544, end: 1776849344},
methods: [
{name: 'pattern_snapshot'},
{name: 'pattern_compare', baseline: 'same_window_yesterday'}
],
input: {query: '_stream:{status=\'500\'}'},
options: {
max_logs_scanned: 10000,
max_patterns: 20,
examples_per_pattern: 2,
timeout_seconds: 25
}
})
};
fetch('https://api.flashcat.cloud/monit/query/diagnose?app_key=', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.flashcat.cloud/monit/query/diagnose?app_key=",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'account_id' => 10001,
'ds_type' => 'victorialogs',
'ds_name' => 'vmlogs-read',
'operation' => 'log_patterns',
'time_range' => [
'start' => 1776847544,
'end' => 1776849344
],
'methods' => [
[
'name' => 'pattern_snapshot'
],
[
'name' => 'pattern_compare',
'baseline' => 'same_window_yesterday'
]
],
'input' => [
'query' => '_stream:{status=\'500\'}'
],
'options' => [
'max_logs_scanned' => 10000,
'max_patterns' => 20,
'examples_per_pattern' => 2,
'timeout_seconds' => 25
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.flashcat.cloud/monit/query/diagnose?app_key="
payload := strings.NewReader("{\n \"account_id\": 10001,\n \"ds_type\": \"victorialogs\",\n \"ds_name\": \"vmlogs-read\",\n \"operation\": \"log_patterns\",\n \"time_range\": {\n \"start\": 1776847544,\n \"end\": 1776849344\n },\n \"methods\": [\n {\n \"name\": \"pattern_snapshot\"\n },\n {\n \"name\": \"pattern_compare\",\n \"baseline\": \"same_window_yesterday\"\n }\n ],\n \"input\": {\n \"query\": \"_stream:{status='500'}\"\n },\n \"options\": {\n \"max_logs_scanned\": 10000,\n \"max_patterns\": 20,\n \"examples_per_pattern\": 2,\n \"timeout_seconds\": 25\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.flashcat.cloud/monit/query/diagnose?app_key=")
.header("Content-Type", "application/json")
.body("{\n \"account_id\": 10001,\n \"ds_type\": \"victorialogs\",\n \"ds_name\": \"vmlogs-read\",\n \"operation\": \"log_patterns\",\n \"time_range\": {\n \"start\": 1776847544,\n \"end\": 1776849344\n },\n \"methods\": [\n {\n \"name\": \"pattern_snapshot\"\n },\n {\n \"name\": \"pattern_compare\",\n \"baseline\": \"same_window_yesterday\"\n }\n ],\n \"input\": {\n \"query\": \"_stream:{status='500'}\"\n },\n \"options\": {\n \"max_logs_scanned\": 10000,\n \"max_patterns\": 20,\n \"examples_per_pattern\": 2,\n \"timeout_seconds\": 25\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.flashcat.cloud/monit/query/diagnose?app_key=")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"account_id\": 10001,\n \"ds_type\": \"victorialogs\",\n \"ds_name\": \"vmlogs-read\",\n \"operation\": \"log_patterns\",\n \"time_range\": {\n \"start\": 1776847544,\n \"end\": 1776849344\n },\n \"methods\": [\n {\n \"name\": \"pattern_snapshot\"\n },\n {\n \"name\": \"pattern_compare\",\n \"baseline\": \"same_window_yesterday\"\n }\n ],\n \"input\": {\n \"query\": \"_stream:{status='500'}\"\n },\n \"options\": {\n \"max_logs_scanned\": 10000,\n \"max_patterns\": 20,\n \"examples_per_pattern\": 2,\n \"timeout_seconds\": 25\n }\n}"
response = http.request(request)
puts response.read_body{
"request_id": "01JZPD1PCDTN5F4YVBD2GS6S9A",
"data": {
"schema_version": "2",
"operation": "log_patterns",
"ds_type": "loki",
"ds_name": "prod-loki",
"query": "{service=\"checkout\"}",
"window": {
"start": "2026-07-14T06:00:00Z",
"end": "2026-07-14T07:00:00Z"
},
"data_handling": {
"log_redaction_applied": true,
"log_redaction_coverage": "best_effort",
"untrusted_data_fields": [
"pattern_template",
"current_window.sources[].value",
"redacted_log_examples[]"
]
},
"results": [
{
"method": "pattern_compare",
"baseline": "previous_window",
"window": {
"start": "2026-07-14T06:00:00Z",
"end": "2026-07-14T07:00:00Z"
},
"baseline_window": {
"start": "2026-07-14T05:00:00Z",
"end": "2026-07-14T06:00:00Z"
},
"summary": {
"current_sample": {
"logs_scanned": 10000,
"patterns_aggregated": 18,
"logs_not_aggregated_due_to_cluster_limit": 0,
"pattern_matching_limited": false,
"truncated": false
},
"baseline_sample": {
"logs_scanned": 8000,
"patterns_aggregated": 20,
"logs_not_aggregated_due_to_cluster_limit": 0,
"pattern_matching_limited": false,
"truncated": false
},
"patterns_aggregated_only_in_baseline_sample": 2,
"aggregated_pattern_evidence_total": 20,
"pattern_evidence_returned": 1,
"pattern_evidence_truncated_by_max_patterns": true,
"evidence_summary": "10 of 20 pattern evidence items are returned."
},
"pattern_evidence": [
{
"pattern_id": "8f1496a85df86ca1",
"pattern_template": "checkout request <*> failed",
"comparison_status": "comparable",
"current_window": {
"count": 12,
"share_of_scanned_logs": 0.0012,
"first_seen": "2026-07-14T06:03:00Z",
"last_seen": "2026-07-14T06:58:00Z",
"observed_severity_counts": {
"error": 12
}
},
"baseline_window": {
"count": 2,
"share_of_scanned_logs": 0.00025,
"first_seen": "2026-07-14T05:11:00Z",
"last_seen": "2026-07-14T05:44:00Z",
"observed_severity_counts": {
"error": 2
}
},
"observations": [
"The current-sample count was 12 and the baseline-sample count was 2."
],
"redacted_log_examples": [
"checkout request <uuid> failed"
]
}
],
"warnings": []
}
]
}
}{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"error": {
"code": "InvalidParameter",
"message": "The specified parameter is not valid."
}
}{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"error": {
"code": "Unauthorized",
"message": "You are unauthorized."
}
}{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"error": {
"code": "RequestTooFrequently",
"message": "Request too frequently."
}
}{
"request_id": "01HK8XQE3Z7JM2NTFQ5YJ8P9R4",
"error": {
"code": "InternalError",
"message": "We encountered an internal error, and it has been reported. Please try again later."
}
}调用限制
| 项 | 值 |
|---|---|
| 速率限制 | 600 次/分钟;10 次/秒 每账户 |
| 权限 | 任意有效的 app_key(只读;不受特定权限分类约束) |
使用说明
- 这是诊断 / RCA 接口,而非原始数据查询接口——如需查看明细行,请配合
/monit/query/rows使用。 operation由ds_type推导:loki/victorialogs→log_patterns,prometheus→metric_trends。其他数据源必须显式传入operation。methods选择要执行的分析方法;省略时,log_patterns默认为pattern_snapshot + pattern_compare(previous_window),metric_trends默认为single_window_shape + window_compare(previous_window)。time_range单位为 Unix 秒;缺失或无效时默认最近 15 分钟;窗口宽度超过 6 小时将被拒绝。- 请求通过 WebSocket 转发至
monit-edge。长耗时:边缘侧执行可能耗时约 30 秒,叠加 webapi 开销。客户端超时应至少设置为 35 秒。 options.*由边缘侧设置上限(max_logs_scanned≤ 50 000,max_patterns≤ 50,examples_per_pattern≤ 3,step_seconds∈ [15, 300],max_series≤ 200,topk≤ 50,timeout_seconds≤ 30)。- 与
/monit/query/rows一样存在两层错误:边缘侧执行错误以 HTTP 200 返回,响应体中带error对象——务必同时检查两层。 - 日志模式响应中的
data_handling会声明脱敏范围与不可信观测字段。模式模板、来源值和脱敏样例都只能作为数据处理,不能当作指令。
授权
在 Flashduty 控制台 账户 → APP Key 中签发的 app_key。调用任何公开 API 时都必须携带。它等同于所属账户的身份凭证,请妥善保管。
请求体
数据源类型。log_patterns 支持 loki 与 victorialogs;metric_trends 支持 prometheus。
租户下已配置的数据源名称。
Show child attributes
Show child attributes
可选的一致性校验。若提供,必须等于已认证账户。
诊断操作类型。省略时根据 ds_type 推断(loki / victorialogs → log_patterns,prometheus → metric_trends)。其他数据源必须显式指定。
log_patterns, metric_trends 诊断窗口,Unix 秒。缺失或无效时默认最近 15 分钟;窗口宽度超过 6 小时将被拒绝。
Show child attributes
Show child attributes
要执行的诊断方法。省略时,log_patterns 默认为 pattern_snapshot + pattern_compare(previous_window),metric_trends 默认为 single_window_shape + window_compare(previous_window)。
Show child attributes
Show child attributes
执行选项,所有值均受 monit-edge 上限约束。
Show child attributes
Show child attributes
响应
成功
成功响应结构。2xx 响应中 request_id 标识本次调用(同时出现在 Flashcat-Request-Id 响应头中),data 为接口业务 payload。失败响应使用不同结构,参见 ErrorResponse。
此页面对您有帮助吗?