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へ飛ばす事が可能です。今回ログ出力処理を書いてみた所、こんな風にカスタムイベントが出力されました。
もちろんこれをアラートルールと絡めて処理失敗時のエラー発報をAzure Monitorにさせることが出来るわけでして、連携の幅がぐっと広がるのかなと思います。これを通じてようやく理解したのが「あ、別にこいつ、対象をWebAppに限る必要は無いのか・・・・ということで、AppService系リソース以外にもたくさん対応できるんだなぁと言うことで、取り敢えずアプリケーション作れば何でもあれこれ出来るみたいです。
今回バッチ処理的なものをApplication Insightsに放り込んだので、通常パターンというか、Web系アプリとは大分違う趣旨のものを実装する感じになりましたが、せめてもう少しメトリック情報とかとれんかなー?と思ったりで。
とりあえずは「おもろかった」
出来合のアプリでも良いので、その内WebAppに突っ込んで解析方法を模索したいなーと思っています。それにしても、この手の調査、実は過去幾度となく行ってみていて、全く頭に入らなくなってたんですが、ようやく1割ぐらいは理解できたのかな、と思った次第です。
それこそ「忘れたくない!」って思いから即興で記事をこうして書いたのであります、まる。
Comments are closed