概要
過去にセキュリティアップデートが原因で、サーバーのタイムゾーンがUTCに戻ってしまう問題が発生しました。この場合、アプリケーションがUTCで動作してしまい、データの整合性が崩れ、サービスに影響を与える可能性があります。これを防ぐために、タイムゾーンの監視を設定することが求められました。
タイムゾーンの監視ツールをNew Relicへ移行する際に、NR-Flexを使用して監視を行うことにしました。
設定ファイルの作成
まず、タイムゾーン情報を取得します。
1 2 3 4 5 6 7 8 9 | $ 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)
だけを取得するために、以下のコマンドを使用しました。
1 2 3 | $ timedatectl | grep 'Time zone' | awk '{print $3" "$4" "$5}' Asia /Tokyo (JST, +0900) $ |
このコマンドをNR-Flexの設定に反映させるため、以下のように設定ファイルを作成しました。
/etc/newrelic-infra/integrations.d/flex-timezone.yml
1 2 3 4 5 6 7 8 | integrations: - name: nri-flex config: name: timezone apis: - name: timezone commands: - run: echo -e "{\"timezone\":\"$(timedatectl | grep 'Time zone' | awk '{print $3" "$4" "$5}')\"}" |
しかし、上記設定を確認コマンドで実行すると、メトリクスの部分が期待通りに出力されず、以下のような結果になりました。
01 02 03 04 05 06 07 08 09 10 11 | $ /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
1 2 3 4 5 6 7 8 9 | integrations: - name: nri-flex config: name: timezone apis: - name: timezone commands: - run: | echo "{\"timezone\":\"$(timedatectl | grep 'Time zone' | awk '{print $3" "$4" "$5}')\"}" |
この修正により、正しい値が取得できるようになりました。
01 02 03 04 05 06 07 08 09 10 | $ /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)" } ] } ︙ |
設定の反映
1 | $ sudo systemctl restart newrelic-infra |
その後、サーバーのタイムゾーンをUTCに切り替え、監視が機能していることを確認しました。
1 | $ sudo timedatectl set -timezone UTC |
NRQLクエリの設定
最終的に、NRQLを以下のようなクエリで作成しました。
1 2 3 4 | 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' |