プロメテウスの原理と二次開発

Prometheus の機能、アーキテクチャ、コンポーネント、構成

1 はじめに

1.1 はじめに

Promethues は、Google の borgmon に触発されたオープンソースのシステム監視およびアラーム フレームワークで、2012 年に SoundCoud の従業員によって作成され、2015 年に正式にリリースされ、2016 年に Cloud Native Computing Foundation に正式に参加しました。

1.2 モニタリングの目的

傾向分析: 監視指標の継続的な収集と統計、および傾向分析。
ディスク容量の増加率を使用して、ディスク容量をいつ拡張するかを判断します。
比較分析: システムの異なるバージョンの運用リソースの使用状況またはパフォーマンス データを追跡および比較します。
アラーム: 障害が見つかった場合でも、ビジネスへの大きな影響を回避するために、問題に迅速に対応します。
障害の分析と特定: 問題を分析してトラブルシューティングし、問題の根本原因を見つけます。
データの可視化:システムの稼働状況、リソースの使用状況、サービスの状況などをダッシュ​​ボードを通じて視覚的に表示します。

1.3 特徴

多次元データ モデル: メトリック名とキーと値のペアを使用して時系列データを区別します。

柔軟で強力なクエリ言語のサポート: PromQL。メトリクスに対して数学的および論理的な操作を実行できます。
単一ノードの展開は分散ストレージに依存しません。
データ収集は HTTP プロトコルに基づいており、プル モードを使用してデータを取得します。
スキャン ターゲットとアラーム管理は、静的構成と動的なサービス検出をサポートします。
PushGateway を使用して、時系列データを Prometheus Server にプッシュできます。
組み込みのダッシュボードは、基本的な機能の表示と管理に使用されます。

1.4 コンポーネント

Prometheus Server: 時系列データのデータ収集と保存、
データのアラーム分析
クライアント ライブラリ: アプリケーション データ収集機能を提供
プッシュ ゲートウェイ: 短期ジョブをサポート、ジョブからプッシュ ゲートウェイにデータをプッシュし、ゲートウェイを Prometheus Server
Exporterに公開: 第三者に公開する サービス データ収集、非侵入型
アラートマネージャー: 重複排除、グループ化、Prometheus サーバーによって生成されたアラームの送信などの機能を実行します。

1.5 アーキテクチャ

プロセス: Prometheus は Service Discovery を通じて収集対象を検出し、
HTTP リクエストを使用して収集対象のインデックス データを取得し、永続的に保存します。

データ集計のローカル ルールを定期的に実行して、新しい時系列データまたはアラームを生成する

アラームをアラームマネージャーに送信すると、アラームマネージャーはグループ化、重複排除、その他の機能を実行してアラーム通知または回復通知を送信します。

Prometheus Server が提供する HTTP API を呼び出して、収集されたデータを取得して視覚化できます。 

1.6 使用シナリオ:

Prometheus はあらゆる純粋なデータの時系列データを記録できます

マシン中心の監視および高度に動的なサービス アーキテクチャの監視によく使用されます
。請求請求などの 100% の精度要件には適していません。

Prometheus環境の構築と利用

2 展開とインストール

コンポーネントの構築 Prometheus Server、Alertmanger、node_exporter、mysqld_exporter

プロセス監視 systemd Supervisord をインストールする

Prometheus環境の構築と利用

3 基本概念

3.1 データモデル:

Prometheus はクエリ結果の一時的な時系列も生成します。
各時系列は、メトリック名とそのラベルのキーと値のペアのセット
形式によって一意に決定されます: <メトリック名>{ラベル名> = <ラベル値>, ...}サンプル [ミリ秒]
インジケーター名: 形式 [a-zA-Z_:][a-zA-Z0-9_:] *
ラベル名: [a-zA-Z_][a-zA-Z0-9_] *
ラベル値:サンプリングされたデータの形式の任意の Unicode 値
: float64 形式

3.2 インジケーターの種類

Prometheus クライアント ライブラリは 4 種類のコア次数を提供します。Prometheus サーバーは型情報を使用しません。
Counter:
単調増加または単調減少の累積指標の場合に使用されるカウント クラス。ターゲットの再起動後にのみ自動的にゼロにリセットできます
。例 -- サービスリクエストの処理 数量
完了したタスクの数
エラーの数ゲージ:測定
クラス
増減可能なデータを使用する場合
例 -- 現在のメモリ使用量同時
リクエストの数例 -- 遅延時間、応答サイズ各バケットの統計、合計統計、および合計統計が含まれます: <basename>_bucket{le=""} <basename> _sum <basename>_count概要: 概要クラスはヒストグラムに似ています 図、クライアント側のパーセンタイルの統計例 -- 遅延時間、応答サイズ各バケットのパーセンタイル情報、合計統計情報、および合計統計量が含まれます: <basename>{quantile=""} <basename> _sum <basename>_count











3.3 課題と例

例: インスタンスは
データ収集のエンドポイントを指します
ジョブ: ジョブは
同じ目的を持つインスタンスのセットを指します
Prometheus はデータ収集時に時系列データにジョブとインスタンスのタグ名と値を自動的に追加します: ジョブ
インスタンス

Prometheus インスタンスごとにコレクション インジケーターを生成: 稼働中 - オンラインかどうか

scrape_duration_ Seconds -- 継続的なイベントを収集し
ます

4つの構成

コマンド ライン パラメーター -- 起動後には変更できません
構成ファイル: コマンド ライン パラメーター --config.file で指定され、デフォルトは prometheus.yml です。
シグナルまたは API を通じて変更およびリロードできます: kill -s SIGHUP $PID
api /-/コマンド ライン パラメータ --web.enable-
lifecycle
: パブリック設定を使用して、グローバル設定ルール ファイルを有効にする必要があります。

説明する

グループ構成ルール グループ
名 ルール グループ名
間隔ルール 実行時間間隔
ルール ルール リスト

レコード: 時系列データを計算して、保存用の新しい時系列データを生成するために使用されます。

説明 レコード 新しい時系列データベース インジケーター名
expr
promql
時系列データの
クエリに使用される式 ラベル ラベル


アラートはアラートの生成に使用されます


コレクションリスト


ルールファイルのチェック


設定をリロードする


アラームインジケーター

5 PromQL


Prometheus は、時系列データ クエリおよび統計式データ型用の PromQL 関数を提供します。

タイムリー ベクトル - 各クエリ結果セットの単一項目の時系列データとサンプル値の 1 セットのみが含まれます。
範囲ベクトル - 各クエリ結果セットの単一項目の複数の時系列データとサンプル値のセットが含まれます。
スカラー--浮動小数点データ
文字列 --文字単位のデータ

時間ベクトルクエリ
範囲ベクトルクエリ
オフセット
サブクエリ
演算
関数


6 HTTPAPI

お問い合わせ:

時間ベクトル クエリ
範囲ベクトル クエリ インジケータ
クエリ クエリラベル クエリタグ値クエリ コレクション ターゲット クエリルールクエリアラームクエリ ディープ セット
ターゲット メタデータ クエリメタデータ クエリアラームマネージャ クエリ設定情報クエリ コマンド ライン設定 クエリ ランタイム情報クエリ コンパイル情報クエリ TSDB 状態 クエリ












管理者: コマンド ライン パラメーター--web.enable-admin-api 経由で
スナップショットを開始 パス /api/v1/admin/tsdb/snapshot
リクエスト メソッド POST PUT
クエリ パラメーター ヘッドをスキップ ヘッダー データ

を削除 タイミング パス /api/v1/admin/ tsdb /delete series
リクエストメソッド Post PUT
クエリパラメータ match[]
start
end
説明 データは実際にはハードディスクから削除されず、圧縮中に後でクリーンアップされます。

ディスクデータをクリーンアップする


ライフサイクル管理: コマンド ライン パラメーターは --web.enable-lifecycle 経由で開始されます。
ヘルス ステータス パス /-/健全な
リクエスト メソッド GET
準備ステータス パス ///準備完了
リクエスト メソッド GET
リロード設定パス /-/リロード
リクエスト メソッド PUT
終了後のパス/-/
リクエストメソッド PUT POSTを終了

7関節モード


8 アラーム管理

  

Prometheus のメインコードの解釈とサービスの検出と制御

メインの go-demo/cmdb · yunixiangfeng/go-demo · GitHub

サーバー開発

プロメテウスモデル管理

Prometheus ノードの確認と削除

Prometheus ジョブの追加、削除、変更、クエリ

Prometheus ターゲットの追加、削除、変更、クエリ

プロメテウス端末の登録

Prometheus構成の取得

プロマジェントの枠組み構築

プロエージェント登録

Prometheus 設定ファイルの更新

Prometheus クライアントの紹介

mysql_exporter の開発

アラーム通知

アラームの問題の処理

CMDB 管理 Prometheus ターゲット

Prometheus ターゲットの追加、削除、変更、クエリ

プロメテウス端末の登録

http://localhost:8080/v1/prometheus/register

Prometheus構成の取得

http://localhost:8080/v1/prometheus/config?uuid=xyz

プロマジェントの枠組み構築

プロエージェント登録

プロメテウスエクスポーターの開発

mysql_exporter の開発

サービスディスカバリの機能

アラーム機能

輸出業者がデータを収集する

16日目

リードミー

エクスポートされたインスタンス

プッシュゲートウェイ
プロメテウスカスケード

ルールは     新しい時系列を生成するための
    アラートを生成します


操作 => 即時 (瞬時) ベクトル

上(URL)

リクエスト {url=abc, code=200}
リクエスト {url=abc, code=400}
リクエスト {url=abc1, code=200}
リクエスト {url=abc1, code=400}

リクエスト {url=abc} 1
リクエスト {url=abc} 2
リクエスト {url=abc1} 3
リクエスト {url=abc1} 4

+

request_total {url=abc} 10
request_total {url=abc1} 11

                on()
左 + 右 group_left()
             group_right()

左結合
右結合
内部結合

セット操作

sum
min
max
avg
topkbottomk

開発する



    1. Prometheus に基づいてアプリケーション API、構成、および PromQL サービス検出を開発=> CMDB Prometheus ターゲット構成
    グラフィカル管理 => 視覚的な
    アラーム ルール管理
    アラームマネージャー => CMDB
         電子メール
         SMS

    複数のプロメテウス


    設定ファイル操作 yml、json
    API => http クライアント

    file_sd_configs:


    1. サービスディスカバリ

    a. prometheus CRUD
        、名前、ip
    b. ジョブ管理ジョブ CRUD
        、prometheus、ジョブ名、スキーム、メトリック、basic_auth、tls
    c.
        ターゲット target

    DB

    プロメテウス => 設定

    エージェント

    systemctl reload exec
    http クライアント API

    2. データ表示データ、グラフィカル、jsを取得するAPI
        (js + ホストリソース監視)

    3. Exporter
        Agent => prometheus client =>
                 通信の統計収集対象(ソケット)

    4. アラーム => DB ストレージ
              通知 SMS => Tencent Cloud


2. Prometheus
    サービスの検出

データ収集方法

プロメテウスのコンポーネント図

サーバー開発

プロメテウスモデル管理

Prometheus ジョブの追加、削除、変更、クエリ

Prometheus ターゲットの追加、削除、変更、クエリ

プロメテウス端末の登録

Prometheus構成の取得

プロマジェントの枠組み構築

プロエージェント登録

Prometheus 設定ファイルの更新

Prometheus クライアントの紹介

mysql_exporter の開発

アラーム通知

アラームの問題の処理

メインの go-demo/クライアント · yunixiangfeng/go-demo · GitHub

プロメテウスクライアントゴー

https://github.com/prometheus/client_golang

prometheus パッケージ - github.com/prometheus/client_golang/prometheus - Go パッケージ

プロメテウスエクスポーターの開発

https://github.com/yunixiangfeng/go-demo/tree/main/mysql_exporter
 

17日目

ネットワークリクエスト

リードミー 

1. prometheus
    ノード
        => クエリ、削除

        エージェント => API 登録 => 追加するために存在しません、
                                 更新するために存在します

        => プロパティ
            uuid
            ホスト名
            アドレス https://host:port/
            #username
            #password
            作成時
            更新時
            削除時

    ジョブ
        => CRUD
        => 属性
            タスク ID [a-zA-Z][0-9a-zA-Z_]
            備考
            ノード node_id
            created_at
            updated_at
            delete_at

    ターゲット
        => 追加、削除、変更、
        名前
        の確認 備考
        追加
        ジョブ
        作成日
        更新日
        削除日

質問:
    1. prometheus.yaml => 変更 => prometheus reload
        => api => ライフサイクル nginx を有効にする => req
            認可: 基本の Base64(name:password)
        => systemctl reload =>
            systemctl が必要です
    2. ジョブ: その他の設定、ターゲットおよびその他の構成は、独自のビジネス ニーズに応じて追加されます
    。 3. 間隔ごとに問題を書き直し、内容が変更されるたびにリロードします
        。prometheusをロードします。
            ジョブ: job1 job2 リロードなしでは変更なし
        target:
            への書き込みは変更できません。ファイル

        ジョブターゲット sort sort json.Marshal => []byte => write

18日目

1. prometheus client_golang
    クライアント
        a. prometheus client(java, go, php, python)
        b. http 公開 => プロセッサ
2. mysqld_exporter
3. Web 基本認証
    a. サーバーは応答してブラウザに認証が必要であることを伝えます => ポップアップ ユーザー名とパスワード 入力ボックス
        401
        www-authenticate: Basic realm="my site"
    b. 認証: Basic xx => メッセージを読んで確認する
        Basic => xxx => Base64 デコード: 分割、確認する ユーザー名: パスワード (プレーン テキスト)

        ユーザー名: パスワード => 設定ファイルの
            ハッシュ => bcrypt/md5
            md5

    cmdb ユーザー ログイン
        フォーム
            ユーザー/パスワード (プレーン テキスト)
        db: ユーザー/パスワード (bcrypt=>hash)

4. アプリケーションは
    http リクエストの総数を監視します カウンタ
    http URL 応答時間統計ヒストグラム/サマリー
    http 各応答ステータス コードの発生数 カウンタ + ラベル

    フィルター:

5. アラートマネージャー
6. アラート管理
    a. アラート受信およびストレージ
        認証:
            認可: トークン xxxxxx
            基本認証: 基本 xxxx
            ベアラー認証: ベアラー xxxxx
        Webhook
            API => altermanager => json => db

            ID => ラベルが生成されました (同じラベルは同じ ID を生成します)
            1 ポイント => インスタンス 1.1.1.1:9999 オフライン
                で復元されました
            10 ポイント => インスタンス 1.1.1.1:9999 オフライン ID

            a => a
            a、b => a、b

        通知: グループキーはユニットにグループ化されています 通知
    b. アラーム クエリ
    c. ページ
7. 通知
    a. 電子メール
    b. Tencent SMS

開発機能 => ビジネスニーズを満たす + テクノロジー (go、beego)
           ビジネスロジック + テクノロジー
           1. 手作業の繰り返し (設計) => 自動化 (開発)
           2. 要件 => 要件分析 => 設計 => 開発


監視:
1. 可用性
2. 遅延
    リクエスト消費時間
    オペレーション使用時間
3. エラー時間
4. 容量
    現在のリクエスト数/総リクエスト
    数 現在の接続数/総接続数

mysql_exporter は何を監視しますか?
mysql => エクスポーター =>
    監視オブジェクト API => インジケーター情報の取得 (計算)
    SQL クエリ =>
                グローバルステータスの表示

mysql 可用性
    操作が失敗しました
        select 1;
        ping
の遅いクエリ時間がグローバル ステータスを示します (variable_name='Slow_queries';)

容量 

qps:

カウンター

グローバルステータスを表示 ここで、variable_name='クエリ';

tqs:

挿入、削除、更新 *

com_insert

com_delete

com_update

com_select

com_replace

接続:

グローバルステータスを表示 ここで、variable_name='Thread_running';

グローバルステータスを表示 ここで、variable_name='max_connections';

アラート => プロメテウス アソシエーション (ノード)

promagent => prometheus.yaml ラベル => uuid => xx

フロー:

グローバル ステータスを表示します (variable_name='Bytes_received')

variable_name='Bytes_send' のグローバル ステータスを表示


json
フォーム => コントローラー => parseForm/unmarshal => オブジェクト => server.insert/


                      アンマーシャル => ALertForm


groupby
アラート名

a =>
    ラベル =>

b => a,b
    a => ラベル =>
    b =>

ページング
    pageSize => 5
    pageNum
    クエリ条件


    オフセット制限
    pageNum => 1,2,3
    (pageNum) - 1 * pageSize
    制限 PageSize

    1 = 0 リミット 5
    2 => 5 リミット 5

querytable.SetCond(cond).Offset().limit()
querytable.SetCond(conf).Count()

ページ
    データ
    ページング関連データ ページの URL パラメータ

プロメテウスプロセス

19日目

1. Alarmmanager アラーム通知
    a. SMS Tencent
    b. 電子メール SMTP グループ単位のアラーム通知 アラーム
    単位のアラーム処理

メールと SMS
    メール送信:
        smtp サーバー smtp プロトコル メール送信
        メールゲートウェイ http api メールパラメーター + URL + 認証

        差出人:
        宛先:
        cc:
        件名:
        内容:
        添付ファイル:

テンセント認証コード:
 

smtp.qq.com


SecretId: AKID44qsOsP1g5GB9qxu1ndW8CzuZIYYfr3y

秘密キー:5qYz4uSnrUrJUe5GDvLUheZEcsQYQKyZ


API URL/リクエスト/レスポンス
認証

リクエスト構造体
構造名 => URL
構造体属性 => リクエストパラメータ

httpリクエスト => httpレスポンス

応答構造


アラーム送信:
    1. API がアラーム情報を受信
    2. JSON デシリアライズ => アラーム グループのアラーム情報
    3. アラーム グループ => アラームの送信
        電子メールの送信
            アラーム コンテンツの生成 => HTML/テンプレート
            テーマ => アラーム名
            ノーティファイア => 設定

            送信:
                smtp サーバー、ポート、ユーザー名、パスワード

        SMS の送信
            SMS コンテンツ => Tencent Cloud SMS テンプレートはパラメータのみを渡すことができます
            通知者 =>
            送信を設定します:
                SDK 呼び出しメソッドの
                アドレス、構造体/オブジェクト、関数呼び出し
        通知者
            は誰に通知する必要があります => (運用および保守)
            ビジネス通知者を設定 => に関連します特定の事業者 =>
                        通知管理アラームのラベルを通知し、通知者をフィルタリングします。
    4. アラーム情報 => アラーム処理

テンプレート関数呼び出し = "

おすすめ

転載: blog.csdn.net/niwoxiangyu/article/details/130607161