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