AWS Athena Datasource †
grafana/athena-datasource †
記事:
トラブルシューティング †
Status: -1. Message: Query error: -1 Request was aborted †
現象:
解決:
- 上記workaroundを実行するか、2.14.0へ更新する
日付と時刻 †
例: 前月を指定: dateがstring型
- ALB: 1分毎のアクセスログの件数
SELECT
date_trunc('minute', parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z')) as time,
count(elb_status_code) as count
FROM
alb1.alb_logs
WHERE
date between '${__from:date:YYYY/MM/DD}' and '${__to:date:YYYY/MM/DD}'
GROUP BY date_trunc('minute', parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z'))
ORDER BY time ASC
- パーティションが 's3://bucket/prefix/YYYY/MM/DD/'形式で, Last 24 hours指定の場合
- パーティションが 's3://bucket/prefix/year=YYYY/month=MM/day=DD/hour=HH/'形式で, Last 24 hours指定の場合
時系列のログからグラフを作る †
時系列のログから、グラフを作りたい場合:
- column_1: date or datetime, order by asc
- column_2: numeric
- 例: dateカラムがstring型(2022-01-02 03:04:05)で、1ヶ月前の時間毎のグラフを作りたい場合。もし、dateカラムがtimestamp型なら、「date_trunc('hour', date)」が良さそう
SELECT
date_parse(substr(date,1,13), '%Y-%m-%d %H') as date_hour,
count(column_X) as count
FROM db1.table1
WHERE
and year=year(now() - interval '1' month)
and month=month(now() - interval '1' month)
group by substr(date,1,13)
ORDER BY date_hour asc
mtanda/grafana-aws-athena-datasource †
更新されてないので、grafana公式のathena pluginの方がオススメ
Cache Durationの指定 †
- Queryの結果を保持する期間を設定できる。「10s」「5m」「1h」等
- デフォルトの0sだと、ダッシュボード表示毎(自動的にリロード毎)に毎回Athenaにリクエストするためコストもかかるし、遅いのでCache Durationは設定した方が良い。
問題:
- v2.2.7:
- 「Max Rows」は「空欄」の状態から、値を入れるとno dataになる事がある。タイムアウト等でno dataの場合でもキャッシュされてるように見える。
- キャッシュキーは「query execution id」と「Max Rows」
- 明示的にキャッシュを削除する方法が不明
- キャッシュに指定した時間(例えば「24h」)が経過しても、expireしないように見える。Athenaの履歴をみると実行されていない。
- 「Max Rows」がキャッシキューの一つなので、明示的に指定する
Time Formatの指定 †
- デフォルトはgolangの RFC3339Nano が指定されており、書式は「2006-01-02T15:04:05.999999999Z07:00」
Timestamp Columnの指定 †
- 時系列のグラフを出したい時など、どのカラムがtimestampなのかを指定する必要がある
- Timestamp Columnが未設定だと、文字列として扱われるようだ。
- RFC3339(iso-8601)書式以外は、Time Formatに書式を指定する
ELB logの場合: timestampカラムがiso-8601形式
- 空の場合: 2020-08-03T09:00:43.338346Z
- timestampを設定後: 2020-08-03 09:00:43
トラブルシューティング †
実行時間が長いqueryがNo dataと表示される †
現象:
解決:
その他:
「AccessDenied (Service: Amazon S3; ...)」で失敗する場合 †
S3のどのAPIが失敗したのか表示されないため、getなのかputなのかの区別が付かず、原因解決が難しい
- Grafana athena datasourceでOutput Locationの設定は必須。設定が無いと、Query Stringが表示されない。
- 履歴を確認
- スキャンしたデータ: 0KB -> スキャン対象のs3 bucketのreadに失敗している。
- Query Stringの場合、s3:GetBucketLocation, s3:GetObject, s3:ListBucket権限があるか。
- Query Execution idの場合、s3:GetObjectがあれば表示はされる。
- 出力結果を書き込む対象のs3 bucketに対して、write権限があるか。
- s3:AbortMultipartUpload, s3:PutObject が必要
Table Panelで一覧表示されない †
- 現象
- ELBのlogだと、以下のようにヘッダと1行目は表示されるが、2行目以降がプルダウンになり、一覧で表示されない
- 解決
- issue を参考に修正。なぜこれで直るのか不明。
Legend Format: {{ }}
Datasourceの説明を見る †
- PanelのDatasourceの右横にある「?」アイコンをクリック。内容は README.md と同じに見える
Query String: GrafanaからSQLを実行 †
- README.md に実験的な機能とある
- SQLを指定して実行し、結果を取得できる。結果が動的に変わるような使い方に有効。
- Query Execution Idは実行済みの結果。AthenaでSQLを実行するとIDが付く。S3に保存された結果を表示しているので静的?
クロスアカウントの場合のs3 bucket policy †
- 例: アカウントA(111111111111)から、アカウントB(222222222222)のexample-bucketの中身を読みたい。なぜかs3:ListBucket, s3:GetBucketLocationが無いと失敗する。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AthenaRead",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::222222222222:root"
},
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::example-bucket/*",
"arn:aws:s3:::example-bucket"
]
}
]
}
- Query Execution Idのみ指定する場合は、s3:GetObjectだけで成功した。
- s3 objectのownerとs3 bucketのownerが異なる場合、s3 bucket policyだけで許可しても読めない。
インストール †
Athenaの仕組みを理解している必要がある。
- S3上のログをデータソースとする場合、Input用のs3 bucketが必要
- Databaseや結果を保存するためのs3 bucketが必要。AWS consoleからAthenaを触ると勝手に作られる
- outputには出力が貯まり続けて、コストが嵩むので、s3 life cycleで古いデータは消すように設定すると良い。シンプルに保つために、複数のWorkgroupの出力先を「output/<workspace>」にしている。例: prefix「output/」、「expiration days: 90」
- 例: s3://aws-athena-query-results-123456789012-ap-northeast-1/output/grafana/
- Athena Workgroup
- 出力先s3 bucketを明示的に指定する。Databaseと検索結果が保存されているように見える
- Grafana Dashbordを開く度にクエリが実行されるため、スキャン上限も100MB等の少なめに設定してから試した方が良い。 デフォルト(primary Workgroup)では無制限になっているためコスト的に危険なので、primaryにもスキャン上限を設定すると良い。
- QueryでもCache Durationが設定できるため、「5m」「1h」といった指定でキャッシュできる
- EC2上にGrafanaを構築してある場合
- IAM policy に書いてあるのはAthenaを実行する権限だけ
- 検索対象ログがs3にある場合、s3:GetObjectも必要
- 検索結果がs3に保存されるので、出力先s3へのs3:PutObjectも必要。上記AWS doc参照
- EC2のinstance profileにIAM roleを設定すると、EC2内部からはアクセスキー無しでIAM roleの権限のAPIが使えるようになる。
grafana-aws-athena-datasourceのバージョン:
- Grafana Labsには未登録だが、grafana-cliからインストールできる。
- https://github.com/mtanda/grafana-aws-athena-datasource/releases からzipのurlをコピー
sudo grafana-cli --pluginUrl https://github.com/mtanda/grafana-aws-athena-datasource/releases/download/2.2.7/grafana-aws-athena-datasource-2.2.7.zip plugins install mtanda-aws-athena-datasource
# CentOS 7の場合: /var/lib/grafana/plugins/ に展開された。
- Grafana v7.xでは unsignedなpluginがloadされないため、allow_loading_unsigned_plugins に許可するpluginをカンマ区切りで入力する
sudo vim /etc/grafana/grafana.ini
--
[plugins]
allow_loading_unsigned_plugins = mtanda-aws-athena-datasource
--
sudo service grafana-server restart
- Grafana > Configration > Data Souces > Add Data Sourceから追加。Test&Saveでエラーが出なければOK
- Name: Athena(account + region ?)
- Auth Provider: Access & SecretKey
- Access Key ID: (athenaと同アカウント、同リージョンのec2のinstance profileの場合は空)
- Secret Access Key: (athenaと同アカウント、同リージョンのec2のinstance profileの場合は空)
- Default Region: ap-northeast-1
- Output Location: s3:///aws-athena-query-results-123456789012-ap-northeast-1/output/grafana/
- Save&Test