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. アラーム情報 => アラーム処理
テンプレート関数呼び出し = "