Go バイナリ、YAML ファイル、SQLite データベース:監視ツールを作成しました

2026/08/26 6:43

Go バイナリ、YAML ファイル、SQLite データベース:監視ツールを作成しました

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

Gjallar は、Go で記述された自己完結型で KISS(Keep It Simple, Stupid)な監視サービスです(約 3,400 行、MIT ライセンス)。HTTP エンドポイント、PostgreSQL、Oracle、Redis、Elasticsearch、ICMP ping、Prometheus メトリクスなどの多様なサービスを追跡します。CGO_ENABLED=0 の設定および純粋な Go 製置き換え(PostgreSQL: pgx、Oracle: go-ora、ICMP: pro-bing、ストレージ: modernc.org/sqlite、Redis: 直接の TCP プロトコル実装)により、クロスコンパイル可能(GOOS/GOARCH フラグ使用)、scp を介して展開でき、Docker、パッケージマネージャー、共有ライブラリ、外部依存関係は不要となる単一静的バイナリ(約 36 MB)が構築されます。

ロックフリーなアーキテクチャにより、各モニターは独自の goroutine で実行され、結果をチャンネルを通じて、状態管理、SQLite の書き込み処理、アップ/ダウンの状態機械を維持する単一の goroutine が消費します。モニターの状態(ダウンステータス、連続失敗回数、最後の通知日時、閾値、再アラート間隔、ノティファヤーリスト)は明示的に保存され、SQLite を介して再起動後も永続化されます。起動時にインシデントが復元されるため、回復時や展開中に DOWN アラートが再発火することはありません。通知は非同期で配信され、送信あたり 15 秒のタイムアウトを設け、SMTP や Telegram API など遅延するノティファヤーによるパイプラインブロックを防ぎます。

アラートロジックは初回の一時的な異常ではなく、N 回の連続失敗後に発火し、リマインダー用のオプションの再アラート間隔を含みます。設定は単一の YAML ファイルで、デフォルト値(interval、timeout、failure_threshold)、命名されたノティファヤー、DSN・クエリー・ルール付きのモニターグループをサポートします。運用機能としては、SIGHUP によるホットリロード(適用前に完全なバリデーション実行)、シークレット用の ${VAR} 環境変数展開、CI レンティング用ドライランチェック用の -check フラグが備わります。

このツールは意図的にクラスターリング、エージェント、プラグインシステム、時系列ダッシュボード、ユーザーアカウントを排除しており、コンフィギュラブルな保留期間(デフォルト 30 日)後の履歴を削減して SQLite を小さく保ちます。ライフサイクル管理には systemd、通知には shoutrrr URL という既存の機構を活用し、作成から数ヶ月経っても理解可能で単純であるよう心がけています。

本文

Gjallar:KISS 精神に基づいた自立型監視ツール

多様なインフラの監視と通知を一元管理したい場合に、過剰な機能や依存関係を持たない軽量な解決策を提供します。Gjallar はその理念を体現した単一バイナリです。

🎯 何をするべきか:多様なサービスの監視と通知

以下のコンポーネントやプロトコルを一括で監視し、問題発生時に即時通知を行います。

  • 監視対象
    • HTTP エンドポイント
    • PostgreSQL データベース
    • Oracle インスタンス(複数)
    • Redis クライアント
    • Elasticsearch インデックス(常に最新の状態維持チェック)
    • ICMP ping 対応マシン
    • Prometheus メトリクス
  • 通知チャネル
    • Telegram
    • SMS
    • Signal

⚙️ なぜ Gjallar か:軽量で自立型の設計思想

既存の監視プラットフォーム(Prometheus + Alertmanager + Grafana など)や複雑なコンテナ構成には以下の理由から、このプロジェクトは採用されませんでした。

  • 分散システムの回避
    • チェック項目が数十個程度でも、「システム稼働状態を確認するために別の分散システムを運用したくない」という意図があります。
  • 依存関係の削減
    • 軽量なオプションでは、Oracle クライアントライブラリのインストールや共有ライブラリへの依存など、環境構築の手間が課題でした。

Gjallar は以下の構成で動作します:

  • 静的バイナリ 1 つ
  • YAML 設定ファイル 1 つ
  • SQLite ファイル 1 つ

全コードは Go で約 3,400 行、MIT ライセンスを採用しています。

🚫 CGO の使用を意図的に排除した点

ビルドコマンドには

CGO_ENABLED=0
フラグを使用し、純粋な Go のライブラリのみで動作するよう設計されています。これにより、C ライブラリ依存(インストール困難)を解消できます。

採用された純粋な Go ライブラリ

  • pgx:PostgreSQL 用接続(libpq 不要)
  • go-ora:Oracle 用接続(Oracle Instant Client 不要)
    • 過去に最小限のリソースサーバーで Oracle クライアントをデプロイした経験があれば、その難しさを理解できるでしょう。
  • pro-bing:ICMP echo ping(特権・非特権環境どちらでも動作)
  • modernc.org/sqlite:SQLite ストレージ(libsqlite3 不要)
  • Redis:ドライバなし。TCP プロトコルを直接話しかける方式を採用しています。

結果としての利点

  • 単一バイナリ化:約 36 MB(主要部分は SQLite と Oracle ドライバ)
  • クロスコンパイル対応
    GOOS/GOARCH
    を指定し、scp で任意のターゲットにデプロイ可能。
  • 環境依存なし:Docker、パッケージマネージャー、共有ライブラリ不要。「私のマシンでは動かない」という問題がありません。

🔒 ロックフリーなアラートパイプライン

監視ツールは並行処理が必要ですが、互斥量(ミュテックス)による競合回避を避けることで、パフォーマンスと安定性を確保しています。ステート管理にロックは一切使用していません。

処理の流れ

[各モニタ] (独立したゴルーチン) 
    ↓ チェック実行 → 結果送信
[共有チャンネル] 
    ↓ リクエストプッシュ
[単一コンシューマ] (状態機械化処理 + SQLite 書き込み)
  • 各モニタ:独自のゴルーチン内でチェックループを実行し、結果をチャンネルに流します。
  • 下流処理:ステート更新、インシデント記録、履歴書き込みはすべて単一のコンシューマゴルーチンが管理します。
    • 状態マップや DB 接続へのアクセスは常に「一つ」のゴルーチンのみなのでロック不要。
    • 並行書き込みを嫌う SQLite も正確に一つで済み、性能劣化を防ぎます。

ステート構造 (
monitorState
)

type monitorState struct {
    down         bool
    consecFails  int           // DOWN アラート発火までの連続失敗数
    downSince    time.Time     // ダウン開始時刻
    lastNotified time.Time     // 最終通知時刻
    threshold    int           // アラート発火閾値
    realert      time.Duration // ダウン中の再通知間隔(0 で無効)
    notifiers    []string      // 通知先リスト
}

運用で重要な 2 つの特性

  1. ステートの永続化
    • SQLite に記録された未解決インシデントから起動時にステートを再構成。
    • ダウン中に再起動しても、アラート重複や復旧通知欠落は発生しません。
    • バージョン更新時にも、動作不連続を防止します。
  2. 非同期な通知配信
    • SMTP の遅延や Telegram API のレート制限に対し、システム全体がブロックされません。
    • 専用のゴルーチンで処理し、15 秒のタイムアウトを設定しています。

ノイズ抑制と再通知

  • フラッピング防止:初回異常検知ではなく、設定された回数(N 回)の連続失敗後にアラートを発火。
  • 再通知機能:インシデントが開状態の間に、オプションの実行間隔設定により再度通知可能。

⚙️ オペレーションを尊重した設定方式

すべての設定は単一の YAML ファイルに統合されています。

設定例

defaults:
  interval: 60s
  timeout: 10s
  failure_threshold: 3
  alerts: [ops-telegram]

alerts:
  ops-telegram:
    url: "telegram://TOKEN@telegram?chats=123456789"

monitors:
  - name: app-db
    type: postgres
    dsn: "postgres://monitor:${PG_PASSWORD}@db1:5432/app"
    query: "SELECT count(*) FROM jobs WHERE status = 'stuck'"
    rule: "== 0"

運用を快適にする機能

  • ホットリロード(SIGHUP)
    • systemctl reload gjallar
      で新しい設定を読み込み。
    • 完全に検証されるまで適用されず、構文エラー時は実行中の設定を維持しログに記録。監視担当者が障害を負うことを防ぎます。
  • 環境変数展開
    • ${VAR}
      形式で展開されます。未定義の場合は明確な起動失敗エラーが発生します。
  • CI 検証(DRY_RUN)
    • -check
      フラグを伴って設定を検証可能。デプロイ前にコードチェックできます。

🙅‍♂️ 意図的に行わないこと

以下のような機能を実装していません。システムライフサイクルには systemd を使用します。通知サービスは shoutrrr URL で 20 種超をサポートしていますが、私が使用するものは限定的です。

  • ❌ クラスタリング
  • ❌ エージェントモード
  • ❌ プラグインシステム
  • ❌ 時系列ダッシュボード
  • ❌ ユーザーアカウント管理

データの維持性

  • 履歴剪定:設定可能な保持期間(デフォルト 30 日)後に自動削除され、SQLite ファイルは永久に小さく保たれます。

なぜこれらを実装していないか?

私が数年来廃棄していった監視ツールは、「プラットフォーム化」し、「監視自体を監視する」必要が生じるという病気で死んでいます。

Gjallar は以下のシンプルさを目指します:

  • 全体状態は 1 つの SQLite ファイル に収まる。
  • 全体挙動は 1 つの YAML ファイル に記述される。
  • 作成後 18 ヶ月経過しても、真夜中の 3 時にその仕組みを理解できるレベルです。

すでに単純なメカニズムで十分賄えるため、複雑な機能を再実装せず、外部ツール(shoutrrr など)へ委譲します。

同じ日のほかのニュース

一覧に戻る →

2026/08/26 6:39

Python の事前宣言定数は少し奇妙です

## Japanese Translation: Python は 6 つのプリデークレードされた項目を持っています:`True`, `False`, `None`, `__debug__`, `Ellipsis`(`...`), および `NotImplemented`。これらはしばしば「定数」と呼ばれますが、その挙動は大きく異なります。 このうち 4 つ(`True`, `False`, `None`, `__debug__`)は通常の識別子ではなく特別な構文的トークンです。そのため: • `x.True` などの式は `SyntaxError` を発生させます。 • 他の文脈では構文上問題がないにもかかわらず、これらに直接代入または削除を行うことは `SyntaxError` を引き起こします(例:`__debug__ = 67` または `del __debug__`)。 • オブジェクト上の属性経由でのアクセス(例:`obj.__debug__`)は無効ではありませんが、`builtins` 内のエントリを変更する(`getattr`/`setattr` を通じて)ことは、構文的トークンの挙動には影響しません。 対照的に、`Ellipsis` と `NotImplemented` は通常のビルトイン関数に近い動作を示します: • 代入によってグローバルにシャドウ化されることが可能です(例:`NotImplemented = 67`)。 • `builtins` 内の値を変更してもモジュールレベルでの名前には影響しますが、構文的トークン(`...` または `NotImplemented` という識別子)そのものには変更はありません。 さらに、`__debug__` は通常 `True` ですが、Python を `-O` フラグで実行すると `False` になります。これら 6 つの項目を区別する exact な設計理由、特になぜ 4 つだけが構文的トークンとして特別扱いされ、残りの 2 つは通常のビルトインとして扱われるのかは、現在も不明です。

2026/08/25 22:01

Apple、M6 と M5 Ultra を発表する

## Japanese Translation: 8 月 25 日(2026 年)、カリフォルニア州クアパティーノでアップルは、地域のアートフィシャルインテリジェンスを変革することを目的とした革命的なシリコンチップを発表しました。頭部のイノベーションは、Mac mini 向けの新しい **M6 チップ**であり、画期的な **2 ナノメートル製造プロセス**を特徴としています。このチップは、12 コア CPU(2 つのスーパークコア、4 つのパフォーマンスコア、および 6 つのエフィシェンシーコアから構成)、ニューラルアクセラレータを備えた 12 コア GPU、そして最大 32GB の統一メモリを高速で最大 170GB/s の速度でサポートします。 新しい Mac Studio とペア付けられているのは、アップルの最初のクワッドダイアーキテクチャであり、高度なウルトラフュージョン技術を利用した **M5 Ultra**です。これは、最大 36 コアの CPU コアと最大 80 コアの GPU コアで構成され、1.2TB/s の帯域幅で驚くべき 512GB の統一メモリをサポートする大規模なスケーラビリティを提供します。M5 Ultra は、AI における M3 Ultra に比べて最大 4.5 倍のパーク GPU コンピューティングを提供するため、大きなパフォーマンスの向上が期待されます。両方のチップは、高解像度のビデオ編集や複雑なエージェントワークフローを可能にする先進的なグラフィック機能を備えており、第 3 世代レイトレーシングとハードウェア加速メッシュシェーディングが含まれています。 これらのアップグレードにより、「Apple Intelligence」(2026 年秋の macOS 27 で、Apple Beta Software プログラムを通じて利用可能)がユーザーデバイスの上で完全に動作し、数百億パラメータを持つ最先端 AI モデルをクラウドサーバーに依存せずにホストできるようになります。新しい開発者フレームワークにより、Xcode や Core ML のようなツールを使用して大規模言語モデルのローカルでの微調整が可能となり、英語、中国語、日本語、韓国語を含む複数の言語で利用できる強力なプライバシー重視のオンデバイス AI 計算への決定的なシフトを示しています。

2026/08/25 23:06

OpenAI Jalapeño:Nvidia Blackwell より優れている

## Japanese Translation: OpenAI は、Broadcom との協力による約 16 ヶ月の開発(2024 年中盤から開始)を経て、「Jalapeño」という推論専用の ASIC を発表しました。LLM の推論のためにゼロから設計された Jalapeño は、過剰な特殊化ではなく極限までのハードウェア・ソフトウェアのコデザインと一般化に依存しており、推定的デコードや特定のワークロード調整を必要とせず、あらゆるモデル推論シナリオで高い性能を実現しています。 InferenceX スイートを用いた独立したベンチマーク(Hot Chips で実施)により、Jalapeño はトークン毎ワットあたりで Nvidia、AMD、Google のチップを上回ることが確認されました。TSMC の N3P プロセスで作製され、HBM4 メモリを備えるこのチップは、GPU に見られる固定されたレイテンシを排除するために順序変換コアと L1 キャッシュを採用し、MXFP 数値形式およびウェイト定数型シンタリック配列を用いて性能の急激な低下を防いでいます。OpenAI の独自プログラミング言語「Gluon」は、高効率を実現するために直接永続スレッドにマッピングされたハンドチューニング済みカーネルを可能にしています。 システムアーキテクチャは、CPU ホストラック(「Katsu」、AMD EPYC プロセッサ搭載)と ASIC ラック(「Vindaloo」、トレイあたり 16 チップ)から構成されます。この設計により、ハイブリッド銅線/光ネットワークを活用して最大 2,048 ユニットまで柔軟にグローバルなスケールアップが可能です。2025 年 11 月にタプトアウト(A0 ステッピング)され、初版はすぐにデプロイが可能で、タプトアウト直後にスループットの大幅な向上が実現されています。現在ファブ内にある将来の B0 ステッピングでは、効率性が約 25% 向上しており、Nvidia の Rubin チップに比べて優れた消費電力性能を提供します。生産は 2027 年に段階的に増産され、多くの出力は翌年の後半に期待されており、OpenAI パートナーが信頼性データを収集する期間としては 1 月までとされています。