概要

過去にセキュリティアップデートが原因で、サーバーのタイムゾーンが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'