iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
DevOps

被稱作Server Restart Engineer的我,也想了解如何實踐可觀測性工程系列 第 26

Day 26 - 使用 Grafana 將可觀測性資料視覺化

  • 分享至 

  • xImage
  •  

不知不覺鐵人賽已經進入倒數完結的階段,我們花了很多篇幅討論如何建立 Data Lakehouse 的架構、如何建立 data pipeline 來將 OTLP 資料寫入 data lakehouse。

當資料存好後,團隊要如何實際看到這些可觀測性資料呢?今天我們要介紹如何用 Grafana 串接 Athena,將儲存在 S3 Table 的資料視覺化成 Dashboard。

為什麼選擇 Grafana + Athena?

Grafana 是目前業界最常用的可觀測性視覺化工具,支援多種資料源(Prometheus、ClickHouse、SQL databases 等)。而 Athena 是 AWS 提供的 serverless 查詢引擎,原生支援 Iceberg Table format,不需要額外的 compute cluster,按查詢掃描的資料量計費。

使用這樣的查詢引擎和視覺化工具的組合,就有以下優勢:

  • 相較於 Spark 等查詢引擎,Athena 因為是 serverless 架構,所以不需要維護伺服器與叢集
  • Athena 原生支援 Iceberg 與 S3 Table
  • Grafana 是目前業界最常用的視覺化工具,在學習資源和樣板豐富的情況下,導入團隊會較為容易

接下來,讓我們來看看要如何讓 Grafana 串接 Athena,成功讀取 S3 Table 中的資料吧。

在 Grafana 設定 Athena Data Source

步驟1: 安裝 Athena Plugin

Grafana 官方提供了 Athena plugin。如果你是用 Docker 執行 Grafana,可以在啟動時安裝:

docker run -d \
  -p 3000:3000 \
  -e "GF_INSTALL_PLUGINS=grafana-athena-datasource" \
  --name=grafana \
  grafana/grafana

安裝後在 Grafana UI 中前往 Connections → Add new connection,搜尋 "Athena" 就能看到這個 plugin。
https://ithelp.ithome.com.tw/upload/images/20251010/20177961THF0XwBrLa.png

步驟2:配置 IAM 權限

Grafana 需要有權限查詢 Athena 和讀取 S3。所以,在這邊我們會建立一個專門的 IAM User grafana-athena-user,附加以下的 policy,賦予 Grafana 使用 Athena 查詢 S3 Table 的權限。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "athena:StartQueryExecution",
                "athena:GetQueryExecution",
                "athena:GetQueryResults",
                "athena:StopQueryExecution",
                "athena:GetWorkGroup",
                "athena:ListWorkGroups",
                "athena:ListDataCatalogs",
                "athena:ListDatabases"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::your-athena-query-result-bucket",
                "arn:aws:s3:::your-athena-query-result-bucket/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetDatabase",
                "glue:GetDatabases",
                "glue:GetTable",
                "glue:GetTables",
                "glue:GetPartition",
                "glue:GetPartitions"
            ],
            "Resource": [
                "arn:aws:glue:*:*:catalog",
                "arn:aws:glue:*:*:database/*",
                "arn:aws:glue:*:*:table/*/*"
            ]
        }
    ]
}

IAM User 創建完畢後,接著產生一把 Access key,稍後會需要將這把 key 給 Grafana 做使用。

步驟 3: 在 Grafana 中設定 Data Source

設定完 Athena 後,就可以回到 Grafana 新增 Athena data source。

  • Datasource Name: grafana-athena-datasource
  • Authentication Provider: Access & secret key (之後 Access Key ID 和 Secret Access Key 欄位則填入方才產生的 access key)
  • Default Region: 填入 S3 Table 所在的地區。這邊範例使用 ap-northeast-1
  • Database: 填入 Athena 目標查詢的 database
  • workgroup: 這裡指的是 Athena 的 Workgroup,用來將使用者、query查詢、設定等進行分組,以實現權限控管、資源隔離、掃描量管理等目的
  • Output Location: 會自動使用 workgroup 的設定,或手動填入你存放 Athena 查詢的 S3 bucket 位址
    https://ithelp.ithome.com.tw/upload/images/20251010/20177961X8hdECMSiB.png

Grafana 與 S3 Table 的相容性

目前撰寫文章的時間點,其最新版本(v11.4.0) Grafana 的 UI 尚不支援顯示 S3 Table 的 catalog。這是因為查詢 S3 Table catalog 和 Glue catalog 的 API 不同導致。

因此,在步驟三要去設定 Data source 的時候,其實我們是沒有辦法在 Database 那個欄位找到 我們在 S3 Table bucket 上建立的 database(在 S3 Table 稱作 namespace)。但是我們可以在設定完 data source 後,創建 dashboard 時進行手動更新。

作法是在 dashboard 的 JSON 檔中,找到 target,接著把裡面的欄位都改成你的 S3 Table 的設定,範例如下:

"targets": [
    {
        "connectionArgs": {
        "catalog": "s3tablescatalog/opentelemetry-man-poc-table-bucket",
        "database": "opentelemetry_man_namespace",
        "region": "ap-northeast-1",
        "resultReuseEnabled": false,
        "resultReuseMaxAgeInMinutes": 60
        },
        "datasource": {
        "type": "grafana-athena-datasource",
        "uid": "aeyu63yvtzrpce"
        },
        "format": 1,
        "rawSQL": "SELECT * FROM opentelemetry_man_metrics_gauge ",
        "refId": "A"
    }
],

手動將 catalogdatabase這兩個欄位改成 S3 Table之設定,儲存之後就可以看到 UI 正常顯示,也能夠成功查詢 S3 Table 上面的資料了。
https://ithelp.ithome.com.tw/upload/images/20251010/20177961WnaYQtop0E.png

結語

今天我們完成了 Observability 2.0 架構的最後一塊拼圖:視覺化。從 Day 1 的架構設計、Day 4 的 Data Lakehouse 建置、到 Day 22-24 的 OTLP 資料轉換,最後,我們就能透過 Grafana 將這些資料呈現出來。

透過 Grafana + Athena 的組合,我們不需要維運額外的查詢引擎,就能直接查詢 S3 Table 中的可觀測性資料。雖然目前 Grafana 對 S3 Table 的支援還需要手動調整 JSON 設定,但相信隨著 S3 Table 的普及,未來 UI 的整合會更加完善。

參考資料

Apache Iceberg - Iceberg AWS Integrations

AWS Documentation - What is Amazon Athena?

Grafana Issue - Plugin does not see S3Tables Table Bucket catalogs as shown in AWS Athena UI

Grafana Plugin - Amazon Athena


上一篇
Day 25 - 另一種架構思維,看即時監控與 data lakehouse 的取捨
系列文
被稱作Server Restart Engineer的我,也想了解如何實踐可觀測性工程26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言