Type ScriptでLog Analyticsにカスタムログデータを送信する
2023-03-20
azblob://2023/03/20/eyecatch/2023-03-20-ts-cutomlog-log-analytics-000_0.jpeg

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ラフレシアが最近のお気に入りの西村でした。