ログの可視化から始めるスマートなサービス運用 ~Log AnalyticsでWindowsパフォーマンスカウンターの情報を収集してみよう~

こんにちは。 弥生のウシオです。

今回は先日ご紹介できなかった、
Cloud Services から Windowsパフォーマンスカウンターの情報を
収集するためのテクニックをご紹介したいと思います。


おさらい

先日のブログでご紹介させていただいた
Log Analytics と Cloud Services の連携方法ですが、
みなさま覚えていらっしゃいますでしょうか?

Cloud Services のログ出力先であるストレージを
Log Analytics のデータソースとして追加してあげるだけでしたね。

その際、収集するログの種類(データ型)を指定するのですが、
選択肢のなかにWindowsパフォーマンスカウンターが存在しません。

Why!?

VMの場合は問題なく収集されますし、
ストレージには WADPerformanceCountersTable も出力されているのですが。

f:id:yayoi_ushio:20160817192950p:plain

嘆いていてもしょうがないので、Cloud Services でもなんとかして
Windowsパフォーマンスカウンターの情報を収集できるようにしよう、
というのが今回のお話です。


結論から先に

はい。結論から言いますと、
Log Analyticsエージェントをインストールすることで収集可能になります。

めでたし、めでたし。

とは、いきません。実はまだハードルがあります。

VMの場合、基本的には1回インストールして終わりですが、
Cloud Services の場合、デプロイ毎に環境が変わってしまうので
その都度インストールしてあげる必要があります。

「毎回手動でインストールを?出来らあ!!」

なんて気概のある方は極稀ですよね。私ならイヤです。


スタートアップタスクに登録しよう

Cloud Services には「スタートアップタスク」という
ロール開始前に実行するアクションが登録できるので、
今回はこの仕組みを使って、エージェントを自動インストールしたいと思います。

azure.microsoft.com

まずは、対象となるWebアプリケーションのプロジェクトに
下記の2つのファイルを追加しましょう。

  • Log Analyticsエージェントのインストーラー
  • 上記インストーラーを実行するためのバッチ

バッチのファイル名は「mma.cmd」とし、中身は以下の通りでOKです。*1

SETLOCAL EnableExtensions
    
:: Bypass installing the agent if locally emulating
IF "%EMULATED%" EQU "true" GOTO:EOF
    
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%
    
SET MMA_ERROR_LEVEL=0
    
CALL:INSTALL_MICROSOFT_MONITORING_AGENT
    
IF %MMA_ERROR_LEVEL% EQU 0 (
    EXIT /B 0
) ELSE (
    EXIT %MMA_ERROR_LEVEL%
)
    
:: --------------
:: Functions
:: --------------
:INSTALL_MICROSOFT_MONITORING_AGENT
    ECHO %ldt% : Begin installing the Microsoft Monitoring Agent >> "%RoleRoot%\mma.log" 2>&1

    :: Current version of the installer
    SET MMA_INSTALLER_PATH="%RoleRoot%\approot\MMASetup-AMD64.exe"

    ECHO Installing the Microsoft Monitoring Agent >> "%RoleRoot%\mma.log" 2>&1
    
    %MMA_INSTALLER_PATH% /C:"setup.exe /qn ADD_OPINSIGHTS_WORKSPACE=1 OPINSIGHTS_WORKSPACE_ID=%WORKSPACE_ID% OPINSIGHTS_WORKSPACE_KEY=%WORKSPACE_KEY% AcceptEndUserLicenseAgreement=1"
    
    ECHO Microsoft Monitoring Agent was installed successfully. >> "%RoleRoot%\mma.log" 2>&1
    
GOTO:EOF

つづいて、Azureクラウドサービスのプロジェクトにある
ServiceDefinition.csdef 内の[Startup]要素の
子要素として以下を追加します。

<Task commandLine="mma.cmd" executionContext="elevated" taskType="simple">
  <Environment>
    <Variable name="EMULATED">
      <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
    </Variable>
    <Variable name="WORKSPACE_ID">
      <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='MicrosoftOMS.WorkSpaceID']/@value" />
    </Variable>
    <Variable name="WORKSPACE_KEY">
      <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/ConfigurationSettings/ConfigurationSetting[@name='MicrosoftOMS.WorkSpaceKey']/@value" />
    </Variable>
  </Environment>
</Task>

同じく、Azureクラウドサービスのプロジェクトにある
ServiceConfiguration..cscfg 内の[ConfigurationSettings]要素の
子要素として以下を追加します。

<Setting name="MicrosoftOMS.WorkSpaceID" value="{インストーラーをダウンロードした画面に表示されていた WORKSPACE ID}" />
<Setting name="MicrosoftOMS.WorkSpaceKey" value="{インストーラーをダウンロードした画面に表示されていた PRIMARY KEY}" />

お疲れ様でした。
あとはプロジェクトをデプロイしてロールが開始されれば
エージェントが自動的にインストールされます。


イヤなことばかりでもないさ

なんでこんな面倒くさいことをしないといけないんだ。
素直にストレージからログを拾ってくれれば済む話じゃないか。

そうですよね。
でも、この方式にもメリットはあるんです。

それは、再デプロイしないでも収集するWindowsパフォーマンスカウンターの種類を変更できること。

エージェントで収集するWindowsパフォーマンスカウンターの種類とインターバルは
「Log Analytics」ポータルで設定できるんです。*2

f:id:yayoi_ushio:20160817191425p:plain

これはありがたいですね。

はい、許した。


今回のブログはいかがでしたでしょうか。

Cloud Services の Windowsパフォーマンスカウンターの情報を可視化したい方は
ぜひ今回ご紹介した内容を試してみてくださいね。*3


*1:x64の環境を前提としております。x86の環境の場合はMMA_INSTALLER_PATHのファイル名を適切に書き換えてください。

*2:なので、エージェントをインストールしただけでは何も収集しません。[Settings]の[DATA]ページにて、何の情報を収集するかの設定も忘れずに実施してください。

*3:本内容は弊社で検証した結果に基づいたものではございますが、これによって生じた一切の損害については、責任を負いかねますので予めご了承ください。