概要
過去にセキュリティアップデートが原因で、サーバーのタイムゾーンがUTCに戻ってしまう問題が発生しました。この場合、アプリケーションがUTCで動作してしまい、データの整合性が崩れ、サービスに影響を与える可能性があります。これを防ぐために、タイムゾーンの監視を設定することが求められました。
タイムゾーンの監視ツールをNew Relicへ移行する際に、NR-Flexを使用して監視を行うことにしました。
設定ファイルの作成
まず、タイムゾーン情報を取得します。
$ timedatectl Local time: Thu 2024-08-22 10:09:07 JST Universal time: Thu 2024-08-22 01:09:07 UTC RTC time: Thu 2024-08-22 01:09:07 Time zone: Asia/Tokyo (JST, +0900) System clock synchronized: yes NTP service: active RTC in local TZ: no $
次に、Asia/Tokyo (JST, +0900)
だけを取得するために、以下のコマンドを使用しました。
$ timedatectl | grep 'Time zone' | awk '{print $3" "$4" "$5}' Asia/Tokyo (JST, +0900) $
このコマンドをNR-Flexの設定に反映させるため、以下のように設定ファイルを作成しました。
/etc/newrelic-infra/integrations.d/flex-timezone.yml
integrations: - name: nri-flex config: name: timezone apis: - name: timezone commands: - run: echo -e "{\"timezone\":\"$(timedatectl | grep 'Time zone' | awk '{print $3" "$4" "$5}')\"}"
しかし、上記設定を確認コマンドで実行すると、メトリクスの部分が期待通りに出力されず、以下のような結果になりました。
$ /opt/newrelic-infra/newrelic-integrations/bin/./nri-flex -verbose -pretty -config_path /etc/newrelic-infra/integrations.d/flex-timezone.y ︙ { "metrics": [ { "-": "e {\"timezone\":\"Asia/Tokyo (JST, +0900) \"}" } ] } ︙ $
この問題を解決するために、以下の方法で設定を修正しました。-eオプションを使用せず、1行ずつ記述することで、NR-FlexがJSON形式として正しく解釈するようにしました。
修正版:/etc/newrelic-infra/integrations.d/flex-timezone.yml
integrations: - name: nri-flex config: name: timezone apis: - name: timezone commands: - run: | echo "{\"timezone\":\"$(timedatectl | grep 'Time zone' | awk '{print $3" "$4" "$5}')\"}"
この修正により、正しい値が取得できるようになりました。
$ /opt/newrelic-infra/newrelic-integrations/bin/./nri-flex -verbose -pretty -config_path /etc/newrelic-infra/integrations.d/flex-timezone.y ︙ { "metrics": [ { "timezone": "Asia/Tokyo (JST, +0900)" } ] } ︙
設定の反映
$ sudo systemctl restart newrelic-infra
その後、サーバーのタイムゾーンをUTCに切り替え、監視が機能していることを確認しました。
$ sudo timedatectl set-timezone UTC
NRQLクエリの設定
最終的に、NRQLを以下のようなクエリで作成しました。
SELECT filter(Count(*), where timezone = 'Asia/Tokyo (JST, +0900)') FROM timezoneSample FACET aws.accountId, label.Name, aws.ec2InstanceId, aws.awsRegion WHERE awsAccountId = 'xxxxxxxxxxxx' AND `label.cloudpack_newrelic`='enabled'