Type ScriptでLog Analyticsにカスタムログデータを送信する
2023-03-20
2022年新卒入社の西村です。
入社してもうすぐ1年経つのか、、、、
お客様のインフラ基盤の構築やメタバースクラウドの自動化を中心にお仕事を遂行し、エンジニアとして力をつけ始めたと強く思う今日この頃、皆さまお元気でしょうか?
今回はType ScriptでAzure MonitorのLog Analyticsにカスタムログを送信する方法をご紹介したいと思います。
ドキュメントにJava Scriptのサンプルが存在しない、、、
「HTTP データ コレクター API を使用して Azure Monitor にログ データを送信する (プレビュー)」 ドキュメントを確認すると、
Power Shell
C#
Python
Java
のサンプルコードしか存在せず、Type Script(Java Script)のサンプルコードが掲載されていない、、、、
Type Scriptでログ送りたいのに、送り方わからないじゃん!!!!
っと叫びたくなったので、同士の皆様に知見を共有していきます。
Type ScriptでLog Analyticsにカスタムログデータを送信する
signatureの作成
import { Buffer } from "buffer";
import crypto from "crypto";
function buildSignature(
customerId: string,
sharedKey: string,
rfc1123date: string,
body: string
): string {
const length = Buffer.byteLength(body);
const binaryKey = Buffer.from(sharedKey, "base64");
const stringToSign = `POST\n${length}\napplication/json\nx-ms-date:${rfc1123date}\n/api/logs`;
const hash = crypto
.createHmac("sha256", binaryKey)
.update(stringToSign, "utf8")
.digest("base64");
const authorization = `SharedKey ${customerId}:${hash}`;
return authorization;
}
crypto.createHmacを使い、Log Analyticsの主キーをSHA-256にエンコードします。
HTTP データ コレクター API にリクエスト
import axios from "axios";
import axiosRetry from 'axios-retry';
async function postData(customerId: string, sharedKey: string, body: string) {
const rfc1123date = new Date().toUTCString();
const authorization = buildSignature(
customerId,
sharedKey,
rfc1123date,
body
);
const logType = "<カスタムログのレコード名>";
const contentType = "application/json";
const uri = `https://${customerId}.ods.opinsights.azure.com/api/logs?api-version=2016-04-01`;
const headers = {
headers: {
"content-type": contentType,
"Authorization": authorization,
"Log-Type": logType,
"x-ms-date": rfc1123date,
},
};
axiosRetry(axios, {
retries: 3,
retryCondition: () => true,
retryDelay: function (retryCount, error) {
return retryCount * 1000;
}
})
await axios
.post(uri, JSON.parse(body), headers)
.then(function (response) {
if (response.status >= 200 && response.status <= 299) {
console.log("Accepted");
} else {
console.log("Response code: ${response.status}");
}
})
.catch(function (error) {
console.log(error);
});
}
axiosでhttpリクエストを行っています。
(axios-retryはリトライ処理用のため、なくても大丈夫です。)
まとめ
今回はType ScriptでLog Analyticsにカスタムのログを送る方法をお伝えしました。
プログラミング言語が違えど、やらなければいけないことは変わらないため、処理の工程を理解していれば簡単に書き換えることができました。(普段Web フロント開発しないため、Type Scriptのお作法を理解するのに苦労はしましたw)
本記事が少しでも誰かのためになれば幸いです。
以上、THE BACK HORN のラフレシアが最近のお気に入りの西村でした。