背景與價值
在云原生和微服務(wù)架構(gòu)日益普及的今天,可觀測性數(shù)據(jù)(日志、指標(biāo)、鏈路追蹤)呈爆炸式增長。觀測云 OpenAPI 數(shù)據(jù)查詢接口為開發(fā)者和運維團(tuán)隊提供了一種**編程化、自動化**獲取這些高價值數(shù)據(jù)的能力,例如:
- 自動化數(shù)據(jù)查詢:將觀測云數(shù)據(jù)集成到內(nèi)部系統(tǒng)或第三方平臺;
- 構(gòu)建自定義儀表盤:根據(jù)業(yè)務(wù)需求靈活展示監(jiān)控數(shù)據(jù);
- 實現(xiàn)數(shù)據(jù)聯(lián)動:打通觀測云與企業(yè)內(nèi)部的數(shù)據(jù)分析流程;
- 批量數(shù)據(jù)處理:高效獲取大規(guī)模監(jiān)控數(shù)據(jù)進(jìn)行離線分析。
OpenAPI 概覽
觀測云將 OpenAPI 作為開放能力的關(guān)鍵構(gòu)成,支持工作空間配置和數(shù)據(jù)查詢,通過請求頭中附加的基于角色的 API Key 進(jìn)行認(rèn)證鑒權(quán),默認(rèn)請求頻率限制為同一 API Key 每分鐘最多請求 20 次、同一工作空間每分鐘最多請求 200次。接入點和請求頭等請參考官方文檔 https://docs.guance.com/open-api/ 。
前置條件
- 創(chuàng)建 API Key:確保登錄用戶有所需的操作權(quán)限。登錄觀測云控制臺,點擊【管理】-【API Keys 管理】-【新建 Key】,填寫名稱與角色,本實踐僅使用數(shù)據(jù)查詢接口,因此使用內(nèi)置角色 “Read-only”。

- 調(diào)試 DQL:數(shù)據(jù)查詢接口通過傳入 DQL 查詢語句進(jìn)行查詢,建議在調(diào)用接口之前確認(rèn)查詢語句,完整語法請參考 https://docs.guance.com/dql/ ,可以在觀測云界面的查詢工具中進(jìn)行調(diào)試,點擊快捷方式 -【查詢工具】,選擇 DQL 查詢模式,支持語法校驗和自動補全:

數(shù)據(jù)查詢接口
基本信息
- 方法:POST
- 接口:/api/v1/df/query_data_v1
請求參數(shù)解析
queries,為 query 對象組成的列表,每個 query 對象中包含獨立的 DQL 語句,依次實現(xiàn)單次請求返回多組查詢結(jié)果,以下是單個 query 對象的關(guān)鍵參數(shù):

場景解析
數(shù)據(jù)查詢場景和查詢方法分類如下,需根據(jù)不同的查詢類型合理配置查詢參數(shù):

示例一:查詢指定 Span 的平均耗時(獲取聚合后的數(shù)據(jù))
請求體,參數(shù)說明見注釋:
{
? ? "queries": [
? ? ? ? {
? ? ? ? ? ? "qtype": "dql",
? ? ? ? ? ? "query": {
? ? ? ? ? ? ? ? "q": "R::resource:(AVG(`duration`) AS `avg(duration)`) { `service` = 'demo' AND `resource` = 'GET /health' }",
? ? ? ? ? ? ? ? "interval": 60, // 查詢時間范圍內(nèi)每 60 秒聚合一個值
? ? ? ? ? ? ? ? "offset": 0,
? ? ? ? ? ? ? ? "limit": 500,
? ? ? ? ? ? ? ? "orderby": [
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? "time": "desc"
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? "timeRange": [
? ? ? ? ? ? ? ? ? ? 1774144800000, // 2026-03-22 10:00:00
? ? ? ? ? ? ? ? ? ? 1774145100000? // 2026-03-22 10:05:00
? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? "disable_sampling": true // 禁止聚合采樣
? ? ? ? ? ? }
? ? ? ? }
? ? ]
}
響應(yīng)體,僅包含重要返回數(shù)據(jù)及其注釋:
{
? ? "code": 200, // 狀態(tài)碼,與 HTTP 響應(yīng)碼保持一致,無錯誤時固定為 200
? ? "content": { // 接口響應(yīng)數(shù)據(jù)
? ? ? ? "data": [
? ? ? ? ? ? {
? ? ? ? ? ? ? ? // ...
? ? ? ? ? ? ? ? "next_cursor_time": -1,? // 下次請求的 cursor_time,因本次查詢?yōu)榫酆喜樵?,返回?-1
? ? ? ? ? ? ? ? "next_cursor_token": "", // 下次請求的 cursor_token,因本次查詢?yōu)榫酆喜樵?,返回為?/p>
? ? ? ? ? ? ? ? // ...
? ? ? ? ? ? ? ? "sample": 1,? ? ? ? ? ? // 采樣率,為 1 表示采樣率 100%,即未采樣
? ? ? ? ? ? ? ? // ...
? ? ? ? ? ? ? ? "series": [? ? ? ? ? ? ? // 數(shù)據(jù)查詢結(jié)果
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? "column_names": [
? ? ? ? ? ? ? ? ? ? ? ? ? ? "time",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "avg(duration)"
? ? ? ? ? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? ? ? ? ? "columns": [
? ? ? ? ? ? ? ? ? ? ? ? ? ? "time",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "avg(duration)"
? ? ? ? ? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? ? ? ? ? "units": [
? ? ? ? ? ? ? ? ? ? ? ? ? ? null,
? ? ? ? ? ? ? ? ? ? ? ? ? ? "time,ns"
? ? ? ? ? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? ? ? ? ? "values": [? ? ? ? ? ? ? ? // 每間隔一個 interval 秒聚合一個數(shù)據(jù)點
? ? ? ? ? ? ? ? ? ? ? ? ? ? [
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1774145040000,? ? ? // 2026-03-22 10:04:00
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1462101213.4054055
? ? ? ? ? ? ? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? ? ? ? ? ? ? [
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1774144980000,? ? ? // 2026-03-22 10:03:00
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 520552891.31707317
? ? ? ? ? ? ? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? ? ? ? ? ? ? [
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1774144920000,? ? ? // 2026-03-22 10:02:00
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 403010784
? ? ? ? ? ? ? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? ? ? ? ? ? ? [
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1774144860000,? ? ? // 2026-03-22 10:01:00
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 496579998.11764705
? ? ? ? ? ? ? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? ? ? ? ? ? ? [
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1774144800000,? ? ? // 2026-03-22 10:00:00
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 608395087.6444445
? ? ? ? ? ? ? ? ? ? ? ? ? ? ]
? ? ? ? ? ? ? ? ? ? ? ? ]
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? "window": 60000
? ? ? ? ? ? }
? ? ? ? ],
? ? ? ? // ...
? ? },
? ? "errorCode": "",? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 錯誤碼,空表示無錯誤
? ? "message": "",? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 錯誤信息
? ? "success": true,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 接口調(diào)用狀態(tài),為 true 時表示調(diào)用成功
? ? "traceId": "69bfdf42000000001ac3936f1436ac54" // 請求的跟蹤 ID
}
示例二:獲取指定類型的所有 Span(獲取原始數(shù)據(jù))
采用分段查詢方式,請求體,參數(shù)說明見注釋:
{
? ? "queries": [
? ? ? ? {
? ? ? ? ? ? "qtype": "dql",
? ? ? ? ? ? "query": {
? ? ? ? ? ? ? ? "q": "R::resource:(`*`) { `service` = 'demo' AND `resource` = 'GET /health' }",
? ? ? ? ? ? ? ? "limit": 1,? ? ? ? ? ? ? ? ? // 分段大小為 1
? ? ? ? ? ? ? ? "cursor_time": 1774145100000, // 初始請求取 timeRange 中的結(jié)束時間,后續(xù)請求取響應(yīng)中的 next_cursor_time 的值
? ? ? ? ? ? ? ? "cursor_token": "",? ? ? ? ? // 初始請求取空值,后續(xù)請求取響應(yīng)中的 next_cursor_token 的值
? ? ? ? ? ? ? ? "orderby": [
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? "time": "desc"
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? "timeRange": [
? ? ? ? ? ? ? ? ? ? 1774144800000, // 2026-03-22 10:00:00
? ? ? ? ? ? ? ? ? ? 1774145100000? // 2026-03-22 10:05:00
? ? ? ? ? ? ? ? ]
? ? ? ? ? ? }
? ? ? ? }
? ? ]
}
響應(yīng)體,僅包含重要返回數(shù)據(jù)及其注釋:
{
? ? "code": 200, // 狀態(tài)碼,與 HTTP 響應(yīng)碼保持一致,無錯誤時固定為 200
? ? "content": { // 接口響應(yīng)數(shù)據(jù)
? ? ? ? "data": [
? ? ? ? ? ? {
? ? ? ? ? ? ? ? // ...
? ? ? ? ? ? ? ? "next_cursor_time": 1774145099284000, // 將值作為下次請求的 cursor_time
? ? ? ? ? ? ? ? "next_cursor_token": "1774145099284000000-R_1774145099284_d6vksl01so5nqftmhv20", // 將值作為下次請求的 cursor_token
? ? ? ? ? ? ? ? // ...
? ? ? ? ? ? ? ? "series": [ // 數(shù)據(jù)查詢結(jié)果
? ? ? ? ? ? ? ? ? ? {? ? ? // 將以單列的方式輸出一條原始數(shù)據(jù)的所有字段,示例響應(yīng)僅保留了 __block_id 字段,禁用單列模式時,列名、列值等分別作為一個單獨的數(shù)組
? ? ? ? ? ? ? ? ? ? ? ? "column_names": [
? ? ? ? ? ? ? ? ? ? ? ? ? ? "time",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "__block_id"
? ? ? ? ? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? ? ? ? ? "columns": [
? ? ? ? ? ? ? ? ? ? ? ? ? ? "time",
? ? ? ? ? ? ? ? ? ? ? ? ? ? "__block_id"
? ? ? ? ? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? ? ? ? ? "units": [
? ? ? ? ? ? ? ? ? ? ? ? ? ? null,
? ? ? ? ? ? ? ? ? ? ? ? ? ? null
? ? ? ? ? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? ? ? ? ? "values": [
? ? ? ? ? ? ? ? ? ? ? ? ? ? [
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1774145099284,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2135893696351448600
? ? ? ? ? ? ? ? ? ? ? ? ? ? ]
? ? ? ? ? ? ? ? ? ? ? ? ]
? ? ? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? ? ? // ...
? ? ? ? ? ? ? ? ],
? ? ? ? ? ? ? ? // ...
? ? ? ? ? ? }
? ? ? ? ],
? ? ? ? // ...
? ? },
? ? "errorCode": "",? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 錯誤碼,空表示無錯誤
? ? "message": "",? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 錯誤信息
? ? "success": true,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 接口調(diào)用狀態(tài),為 true 時表示調(diào)用成功
? ? "traceId": "69bfec720000000042c950e749998eff" // 請求的跟蹤 ID
}
最佳實踐
- 權(quán)限最小化:為不同的應(yīng)用場景(如報表系統(tǒng)、告警機(jī)器人)創(chuàng)建獨立的 API Key,并賦予最小必要權(quán)限;
- 避免觸發(fā) API 限流:一次請求中包含多條查詢語句,盡量在應(yīng)用層增加歷史數(shù)據(jù)緩存;
- 錯誤處理:必須對 API 返回的錯誤進(jìn)行處理,例如實現(xiàn)指數(shù)回退重試機(jī)制;
- 監(jiān)控請求 OpenAPI 的服務(wù):確保相關(guān)業(yè)務(wù)健康運行;
- 在接口參數(shù)中設(shè)置聚合間隔和排序字段,而非在 DQL 中設(shè)置:DQL 支持以時間子句設(shè)置聚合間隔,但是 API 返回的點數(shù)受到優(yōu)先級規(guī)則限制,只有 interval 參數(shù)和時間子句中的間隔保持一致時才能獲得符合預(yù)期的結(jié)果,因此,建議使用 API 參數(shù)設(shè)置聚合間隔和排序方式,在其他場景中,如果 API 參數(shù)與 DQL 子句功能重復(fù),仍然建議優(yōu)先使用 API 參數(shù)而非 DQL 子句,利于編碼且語義統(tǒng)一;
- 獲取原始數(shù)據(jù)時關(guān)閉單列模式,以減小響應(yīng)體的體積:請求時設(shè)置 disableMultipleField=false 即可關(guān)閉單列模式,注意,此時用于聚合查詢的 funcList 參數(shù)將失效。
總結(jié)
本文檔圍繞觀測云 OpenAPI 數(shù)據(jù)查詢接口展開,介紹了其在云原生可觀測場景下的應(yīng)用價值,說明了接口認(rèn)證、限流規(guī)則及創(chuàng)建 API Key、調(diào)試 DQL 語句等前置準(zhǔn)備,詳細(xì)解析了 `/api/v1/df/query_data_v1` 接口的請求參數(shù),并通過聚合數(shù)據(jù)查詢、原始數(shù)據(jù)分段查詢兩個典型示例展示使用方法,最后給出權(quán)限、限流、錯誤處理等方面的最佳實踐,可幫助開發(fā)者快速接入并規(guī)范使用該接口實現(xiàn)監(jiān)控數(shù)據(jù)的程序化獲取與應(yīng)用。