[Python][Azure] Application InsightsとPython3の連携

Application InsightsとLinux/Python3の連携

ここ最近お仕事でもApplication InsightsなどのようなMicrosoft AzureのPaaS連携リソースとにらめっこする日々がちょいちょい発生しています。特に理解が難しいのがAppServiceであり、特に辛いのがApplication Insightsです。

面白いことに、App ServiceだけがLogAnalyticsとの連携が主要リソースと呼ばれる代物の中では全く出来ず、同じ事をするにはApplication Insightsを使う必要があります。Windows版WebAppだとAzure Portalレベルで連携の設定を組み込むことが出来るんですが、Linux版のWebAppだとそれが出来ず、完全にコードレベルで連携をとる必要がありそうなのです。

で、今までJavaやらC#やら手を出してみたんですが、やっぱり専門性が全く私になく、唯一何とかギリギリで手が出そうかなーと言うのがPython3です。さぁどげんしようかと。

着手してみる。

で、調べたらこんなものが。

Application Insights SDK for Python
https://microsoft.github.io/ApplicationInsights-Python/

このSDK導入手順は非常に簡単で、pipを使ってインストールすることが可能です。

# pip3 install applicationinsights

スクリプトから呼び出す際は、このモジュールを呼び出すとよいようです。

# モジュール読み込み処理
import json
import os
import urllib.request
import uuid
import napalm
import sys
from pprint import pprint
import ipaddress
import datetime
from applicationinsights import TelemetryClient

一番最後の行でTelemetryClientと言う名前でSDKを呼び出しています。
やっぱりプログラムの中でApplication Insightsを実装する必要がありそうです。

・・・・・で、ふと気づいたのですが、実はこいつもしかしてWebApp~呼び出さなければならないって事ではないんじゃね?と言うことに気づきました。我が家のローカルマシンからも同様に何か出来るんじゃないか?と言うことで、試しに仕組みを組んでみることにしました。

Pythonスクリプトに実際に仕込んでみる

そこで、ちょうど先に書いた記事にローカルブレイクアウト処理を作ったのがあったので、これをいじってApplication Insightsに吐き出してみようか・・・と言うことを考えました。
今回は最も簡単なカスタムイベントに対してnameとしてログを飛ばす処理を追加してみました。

# AppInsights Instrumentation Code(追加箇所)
appInsights_IC='<Your Instrumentation code>'

def printLogFile(severity, prtLogfile, messageText):

    # Application insightsに対するログ出力→カスタムイベントとして出力(追加箇所)
    tc = TelemetryClient(appInsights_IC)
    tc.context.application.ver = '0.2'
    tc.context.device.id = 'libra.bluecore.net'
    tc.context.device.oem_name = 'VMware'
    tc.context.device.model = ''
    tc.context.device.type = 'Onpremise'
    tc.track_event("[" + severity + "] " + messageText)
    tc.flush()

    # ローカルログファイルへ出力
    with open(prtLogfile,'a') as f:
      date_now = str(datetime.datetime.now())
      lineMessage = date_now + ' ' + severity + ' '  +messageText + '\n'
      f.write(lineMessage)

上記は実際に作ったログ出力処理なのですが、(追加箇所)と書いたあたりが該当します。
Application Insightsはそのリソースに対してユニークな「インストルメンテーションコード」というのをもっています。実際のApplicatoin Insights上の画面で確認することが可能です。

インストルメンテーションコード

ここに書かれた16進数の羅列を定義に組み込み、SDKを呼び出すことで、これをApplication Insightsへ飛ばす事が可能です。今回ログ出力処理を書いてみた所、こんな風にカスタムイベントが出力されました。

Application Insightsに取り込まれたログたち

もちろんこれをアラートルールと絡めて処理失敗時のエラー発報をAzure Monitorにさせることが出来るわけでして、連携の幅がぐっと広がるのかなと思います。これを通じてようやく理解したのが「あ、別にこいつ、対象をWebAppに限る必要は無いのか・・・・ということで、AppService系リソース以外にもたくさん対応できるんだなぁと言うことで、取り敢えずアプリケーション作れば何でもあれこれ出来るみたいです。

今回バッチ処理的なものをApplication Insightsに放り込んだので、通常パターンというか、Web系アプリとは大分違う趣旨のものを実装する感じになりましたが、せめてもう少しメトリック情報とかとれんかなー?と思ったりで。

とりあえずは「おもろかった」

出来合のアプリでも良いので、その内WebAppに突っ込んで解析方法を模索したいなーと思っています。それにしても、この手の調査、実は過去幾度となく行ってみていて、全く頭に入らなくなってたんですが、ようやく1割ぐらいは理解できたのかな、と思った次第です。
それこそ「忘れたくない!」って思いから即興で記事をこうして書いたのであります、まる。