[検討]GCP Datastreamのログの監視
Issue
https://fastdoctor.atlassian.net/browse/SRE-959
Datastreamの転送ができてるかの監視がログからしか拾えなさそう。
gcp.datastream.stream.bytes_count
gcp.datastream.stream.event_count
gcp.datastream.stream.freshness
gcp.datastream.stream.latencies.avg
gcp.datastream.stream.latencies.samplecount
gcp.datastream.stream.system_latencies.avg
gcp.datastream.stream.system_latencies.samplecount
gcp.datastream.stream.total_latencies.avg
gcp.datastream.stream.total_latencies.samplecount
gcp.datastream.streamobject.bytes_count
gcp.datastream.streamobject.event_countログ監視の方式を検討したい。
検討内容
Datadogで監視する場合は作成物が多く管理対象が増えたりコストがかかりそう。
また上記を監視する仕組みも必要になりそう。
ログ監視はdatadogを使わずにgcpのアラート機能使って直接Slack通知させるのがいいかもしれない。
| 評価項目 | ログ転送 & datadog監視 | gcpアラートポリシー |
|---|---|---|
| 作成が容易 | △ | ○ |
| 作成物が少ない | △ | ○ |
| 料金の安い | △ | ○ |
| 運用コストの低い | △ | ○ |
ログ転送 & datadog監視
作成物
- logルーター
- pub/sub
- kms
- dataflow
- サービスアカウント
- SecretManager
- VPC
- FW
- GCSバケット
- Datadog
- 監視モニタ
コスト
- Dataflow
- Pub/Sub
- 1/14の2,3時間稼働で以下。本番運用で常時稼働させた場合2,3万くらいになりそうな気がする(もう少し削減できる設定あるかも)
- スペックはデフォルト n1-standard(CPU:1コア memory:3.7GB)
- ワーカー1台
作成手順
- Datadogを始めてみましょう
- セキュアにするために↓ & 構成図あり
- https://zenn.dev/datadog/articles/datadog-gc-logs-dataflow
- ネットワークをプライベートに配置すればセキュアに転送できる
メリット
- Datadogで監視が統一できる
- Datadogでログの分析がしやすい
- Pub/Subでメッセージ確認したり順序指定や保持期間の設定ができる
- Dataflowのスペックを上げれば転送時間がよりタイムリーになるかも?
デメリット
- 検討・設計事項が多くできるまで時間がかかる
- 作成物が多く運用管理対象が増える
- 構成が煩雑
- ログ転送を監視する仕組みが必要になる
- 今回はDatastreamのログだけなので比較的コストが大きい(監視対象が多いほどコストメリットがある)
gcpアラートポリシー
- 作成物
- ログ指標(ログのフィルタする)
- アラートポリシー
- コスト
- datadog構成との差異でいくとアラート部分のみ。
アラート ポリシー条件あたり月額 $1.50. 指標アラート ポリシー条件のクエリによって返される 1,000,000 件の時系列ごとに $0.35- https://cloud.google.com/stackdriver/pricing?hl=ja
- もし将来的にGCPのサービス増えるなら比例してコストが上がっていきそう
- メリット
- 作成が比較的はやい
- 作成物が少なく管理コストもそこまで増えなさそう
- 構成がシンプル
- 比較的コストが少ない
- デメリット
- Datadogで統一できずGCPでもアラートがあるので認知負荷になりそう
- Datadog上でのログの分析ができない(GCPで確認するための学習が必要)
- 作成手順
- 検証して通知できた。
- ステータス変わってログ自体はすぐに出力されるが、タイムウィンドウが10分だと検知・アラートまで時間かかるので最初はもう少し短めで5分くらいでいいかも
フィルタ
`(severity="ERROR" AND jsonPayload.context="CDC") OR (severity="ERROR" AND jsonPayload.eventCode="STREAM_STATE_CHANGED")`設定値エクスポート
{
"name": "projects/fdt-sre-dev/alertPolicies/6647143076577420251",
"displayName": "datastream-status-check",
"documentation": {
"content": "test",
"mimeType": "text/markdown",
"subject": "datastream-status-error"
},
"userLabels": {},
"conditions": [
{
"name": "projects/fdt-sre-dev/alertPolicies/6647143076577420251/conditions/7711321040218244280",
"displayName": "datastream-status-check",
"conditionThreshold": {
"aggregations": [
{
"alignmentPeriod": "300s",
"crossSeriesReducer": "REDUCE_SUM",
"perSeriesAligner": "ALIGN_SUM"
}
],
"comparison": "COMPARISON_GT",
"duration": "60s",
"filter": "metric.type=\"logging.googleapis.com/user/datastream-error-log\"",
"trigger": {
"count": 1
}
}
}
],
"alertStrategy": {
"notificationPrompts": [
"OPENED",
"CLOSED"
]
},
"combiner": "OR",
"enabled": true,
"notificationChannels": [
"projects/fdt-sre-dev/notificationChannels/15624255533568098089"
],
"creationRecord": {
"mutateTime": "2025-01-16T03:10:34.935968375Z",
"mutatedBy": "takahiro.oga@fdteam.jp"
},
"mutationRecord": {
"mutateTime": "2025-01-16T04:13:12.130750897Z",
"mutatedBy": "takahiro.oga@fdteam.jp"
},
"severity": "CRITICAL"
}フィルタされるログのサンプル