Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新(準備中)

Apr 17, 2023 - コメント - 日記

Lokiのデータを一定時間後に削除する

Grafana Loki はログ管理システムであり、大量のログデータを効果的に管理するために使用されます。しかし、Loki はログデータが膨大になるとストレージ領域を圧迫する可能性があります。そこで、一定期間ごとに Loki の古いログデータを削除する必要があります。本記事では、Bash シェルスクリプトを使用して Loki のログデータを削除する方法を説明します。

Bash スクリプトを使用した Loki ログデータの削除 以下に、Bash シェルスクリプトで Loki のログデータを削除する方法を示します。このスクリプトを使用すると、指定された日数より古いログデータを削除することができます。

#!/bin/bash

if [ $# -ne 3 ]; then
  echo "Usage: $0 <older_than_days> <label_name> <label_value>"
  exit 1
fi

LOKI_API_BASE="http://localhost:3100"
OLDER_THAN_DAYS="$1"
LABEL_NAME="$2"
LABEL_VALUE="$3"

# 削除基準となる日付を計算します
threshold_date=$(date -u -d "${OLDER_THAN_DAYS} days ago" +%Y-%m-%dT%H:%M:%SZ)

# 削除対象となるログストリームを取得します
streams_url="${LOKI_API_BASE}/loki/api/v1/series?match=${LABEL_NAME}%3D%22${LABEL_VALUE}%22"
streams_response=$(curl -s -X GET "${streams_url}")

# 各ログストリームに対して、削除処理を実行します
stream_count=0
while read -r stream; do
  stream_count=$((stream_count+1))
  labels_str=$(echo "${stream}" | sed -n 's/.*"stream":{\\(.*\\)}.*/\\1/p')

  delete_url="${LOKI_API_BASE}/loki/api/admin/delete_series?match=${labels_str}&end=${threshold_date}"
  delete_response=$(curl -s -o /dev/null -w "%{http_code}" -X POST "${delete_url}")

  if [ "${delete_response}" -ne 204 ]; then
    echo "Error deleting logs for ${labels_str}: ${delete_response}"
  else
    echo "Deleted logs for ${labels_str}"
  fi
done < <(echo "${streams_response}" | grep -oP '{"stream":{.*?}}')

echo "Number of streams found: ${stream_count}"

このスクリプトに必要なパラメータは次のとおりです。

<older_than_days>: 削除する日数 <label_name>: ログに対するラベル名 <label_value>: ログに対するラベル値 これらのパラメータをスクリプトに渡すには、以下のように実行します。

./delete_old_logs.sh 30 your_label your_label_value

この例では、OLDER_THAN_DAYS を 30、LABEL_NAME を your_label、LABEL_VALUE を your_label_value に設定しています。これにより、指定されたラベルと値を持つ 30 日より古いログデータを削除できます。

スクリプトを実行可能にして保存します。例えば、delete_old_logs.sh という名前で保存する場合:

chmod +x delete_old_logs.sh

このスクリプトを手動で実行するか、cron ジョブやタスクスケジューラーを使用して定期的に実行させます。例えば、Linux の cron ジョブで毎日実行するには、以下のような設定を追加します。

0 0 * * * /path/to/delete_old_logs.sh

この Bash シェルスクリプトは、指定されたラベルと値を持つログデータを検索し、指定された日数より古いログデータを削除します。これにより、特定のラベルに基づいて古いログデータを定期的に削除できます。