[Dynatrace] OneAgentが自動バージョンアップされたら通知するWorkflow

# OneAgentは知らないうちにバージョンアップされる

DynatraceのOneAgentは、新しいバージョンが公開されると、デフォルトではOneAgent自身で自動バージョンアップします。これは手間いらずで便利なのですが、OneAgentに含まれる各種モジュールは、対象プロセスを手動で再起動して読み込みなおす必要があります。スクリーンショットのように注意書きが表示されます。OneAgentが自動バージョンアップされた後、各モジュールもスムーズに最新バージョンにするため、OneAgentがバージョンアップされたら通知するWorkflowを作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/4d910d77-0bf5-8f7e-fdb3-333a40a8f945.png)

OneAgentがバージョンアップされたらメールが届くようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/e11fb059-a21a-a170-9b5b-a8a92e0e1389.png)

またこの記事は、定期実行されるWorkflowの結果を何らか保存し、次回の実行時に参照する方法について書いていますので、いろいろ応用できるかと思います。

# Workflow概要

作成したWorkflowは以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/1f4e0d5b-1cb7-4131-923b-561c908b3167.png)

## 1. トリガー

スケジュールで自動実行します。定期実行のトリガーアクションであるScheduleを選択し、6時間毎に実行するように設定しています。この間隔はお好みで調整してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/ac81d433-7746-4514-0cc7-0dc53b58b1f4.png)

## 2. 現在のOneAgentのバージョンを取得する

次の `get_oa_new_version` では、このWorkflowが実行されるEnvironmentに紐づいているOneAgentのバージョンのうち、最新のものを取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/3638eb96-8d4d-9d1d-a1a0-d18cdc3f132c.png)

DQLクエリのアクションで、ホスト情報からOneAgentのバージョンを取り出しています。複数ホストで複数のOneAgentのバージョンがある場合は最大のものを選んでいます。

DQLのクエリをノートブックにコピーして実行してみると以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/79a1572f-d8c3-6d02-9c49-658f0e65d771.png)

バージョンを文字列として降順にソートし先頭行を取っています。なお、文字列比較なので `1.297.53` の `53` の部分が1桁の場合、例えば `1.297.7` と比較すると本当は後者の方が古いのですが、ソート順が上がるため誤検知につながることがありますので要改善です。

## 3. 過去のOneAgentのバージョンを取得する

次の `get_oa_prev_version` では、前回までのこのWorkflowの実行時に保存されたOneAgentのバージョンを取得します。

ここでポイントなのですが、前回までのWorkflowの実行結果をログとしてEnvironment内に保存しています。ですので、`fetch logs` でログを取得し、`oneagent_version` という属性がある行だけを抜き出しています。

Workflowの実行間隔によってはログが得られないことがあるので、前回の実行時のログが含まれるような期間を `fetch logs, from: -12h` などと指定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/8ce5a9c7-c355-f660-32a0-b7926438b9ce.png)

ノートブックにクエリをコピーして実行してみます。イメージしやすくするため `limit 1` をコメントアウトしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/436150b6-7fa7-3bec-e747-cb0aedf50789.png)

ログに保存されたOneAgentのバージョンと、そのバージョンが最後に記録されたタイムスタンプが表示されています。

`limit 1` とすることで最初の行、つまりログに記録されている中から最新のバージョンが得られます。

## 4. 現在と過去のOneAgentのバージョンが異なっていれば通知する

次の `send_mail` アクションでは、2. と3. で取得したOneAgentのバージョンが異なっている場合に、バージョンアップされたと判断し通知を行います。

本記事ではメール送信アクションを使用していますが、SlackやJiraなどのアクションも利用可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/1f5f4c47-da62-bc40-58bf-634f0efa0a88.png)

メッセージ本文には、2. や 3. で取得した情報を変数で埋め込んでいます。Preview で実際のメッセージを確認できます。（このPreviewでは新旧のバージョンが同じになっています。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/3452f0a3-393f-27d2-13af-94efdc22bfb3.png)

ポイントはConditionsです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/a973ff47-0a1d-45fc-9e22-7a6ccfd57fb2.png)

ここで 2. の `get_oa_new_version` の `installerVersion` と 3. の `get_oa_prev_version` の `oneagent_version` を比較し、異なっていれば通知を行います。同じであれば前回からはバージョンアップされていないので何もしません。`!=` で比較しているので、異なっていれば `true`、同じであれば `false` になります。

実行結果の例を見てみると、Conditionsがfalseの場合は、以下のように `send_email` のアクションはグレイアウトされていて実行されなかった (Discarded) ことが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/5337f62b-340b-da95-e82c-7d0ea751b39d.png)

## 5. Workflowの実行結果＝現在のOneAgentのバージョンをログとして記録する

最後に、今回のWorkflowで取得した、現在のOneAgentのバージョンをログとして記録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/42e937ac-c454-eb88-af1f-f9e5560ba1b9.png)

ここではJavaScriptアクションを使っていますが、HTTPアクションでAPI経由でログを記録することもできます。JavaScriptの場合は、実行ユーザー（任意に設定可能）に割り当てられている権限で動作するため、場合によっては使いづらいことがあるかもしれません。HTTPであれば専用のトークンを作っておけば権限を固定しておくことが容易です。一方HTTPの場合はトークンやURLなど、Environmentに固有の情報が含まれるため、複数のEnvironmentで共用したい場合には使いづらくなります。JavaScriptの場合は、さらに前後でデータの加工など追加の処理も書けるため、より柔軟性が高いです。

ログ本体はJSONで送っています。JSONで送っておくと属性値を取り出す際に使いやすいです。実際のログ行は以下のようになります。（以下は10分間隔でWorkflowを実行した例）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/7d8d0dbf-54b5-5311-aa43-5b8929400e8c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/e7022cef-d2e1-cb29-ef30-f8651cf90954.png)

# おまけ: ActiveGateの場合

ActiveGateのバージョンアップも通知したい、という場合には、現在のバージョンの取り出し方が少し変わります。DQLでアクセスできる情報に含まれていないため、JavaScriptを使って取得します。複数のActiveGateがある場合は、重複するバージョンを取り除いて、最大のものを取り出しています。Workflowのうち、このステップ以外はOneAgentの場合と同様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/2faf535f-e077-7d51-a3d8-8d1b07392c88.png)

このように、Workflowを使うと痒い所に手が届く便利なスクリプトを作ることができ、自動化することでより安定的な運用につながります。ぜひお試しください。

Dynatraceフリートライアル → https://www.dynatrace.com/ja/trial/