このページの本文へ

FIXER Tech Blog - Azure

FIXER cloud.config Tech Blog

Type ScriptでAzureのLog Analyticsにカスタムログデータを送信する

2023年03月31日 10時00分更新

文● 西村凌/FIXER

  • この記事をはてなブックマークに追加
  • 本文印刷

 本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「Type ScriptでLog Analyticsにカスタムログデータを送信する」を再編集したものです。

 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にカスタムのログを送る方法をお伝えしました。

 プログラミング言語が違えど、やらなければいけないことは変わらないため、処理の工程を理解していれば簡単に書き換えることができました(普段ウェブフロント開発しないため、Type Scriptのお作法を理解するのに苦労はしましたw)。

 本記事が少しでも誰かのためになれば幸いです。

 以上、THE BACK HORNラフレシアが最近のお気に入りの西村でした。

西村凌/FIXER
インフラエンジニア1年生

カテゴリートップへ

この連載の記事