Friends PrometheusとCaché

プロメテウスは、 時系列データの収集に適した監視システムの1つです。

インストールとセットアップは非常に簡単です。 PromDashデータを表示するためのグラフィックサブシステムが組み込まれていますが、開発者自身が無料のサードパーティ製品Grafanaの使用を推奨しています。 プロメテウスは多くのこと(ハードウェア、コンテナ、さまざまなDBMS)を監視できますが、この記事では、 Cachéインスタンスの監視について詳しく説明します(より正確には、インスタンスはEnsembleですが、キャッシュのメトリックを取得します)。 誰も気にしない-あなたは猫の下で歓迎されています。





最も単純なケースでは、PrometheusとCachéは同じマシン(Fedora Workstation 24 x86_64)上に存在します。 Cachéバージョン:



%SYS> write $ zv

UNIX用キャッシュ(x86-64向けRed Hat Enterprise Linux)2016.1(ビルド656U)2016年3月11日金曜日17:58:47 EST


インストールとセットアップ



適切なPrometheusディストリビューションをオフサイトからダウンロードし、/ opt / prometheusディレクトリに保存します。



画像



アーカイブを展開し、必要に応じて既存のテンプレート設定を編集して、Prometheusを起動します。 デフォルトでは、Prometheusは作業ログを直接コンソールに書き込むため、アクティビティに関するエントリをログファイルにリダイレクトします。



プロメテウスを起動する
#pwd

/ opt /プロメテウス

#ls

prometheus-1.4.1.linux-amd64.tar.gz

#tar -xzf prometheus-1.4.1.linux-amd64.tar.gz

#ls

prometheus-1.4.1.linux-amd64 prometheus-1.4.1.linux-amd64.tar.gz

#cd prometheus-1.4.1.linux-amd64 /

#ls

console_libraries consolesライセンス通知prometheus prometheus.yml promtool

猫prometheus.yml

グローバル:

scrape_interval:15s#スクレイプ間隔を15秒ごとに設定します。 デフォルトは1分ごとです。



scrape_configs:

-job_name: 'isc_cache'

metrics_path: '/メトリック/キャッシュ'

static_configs:

-ターゲット:['localhost:57772']

#. /prometheus> /var/log/prometheus.log 2>&1&

[1] 7117

#head /var/log/prometheus.log

time = "2017-01-01T09:01:11 + 02:00" level = info msg = "開始プロメテウス(バージョン= 1.4.1、ブランチ=マスター、リビジョン= 2a89e8733f240d3cd57a6520b52c36ac4744ce12)" source = "main.go:77"

time = "2017-01-01T09:01:11 + 02:00" level = info msg = "ビルドコンテキスト(go = go1.7.3、user = root @ e685d23d8809、date = 20161128-09:59:22)"ソース= "Main.go:78"

time = "2017-01-01T09:01:11 + 02:00" level = info msg = "設定ファイルprometheus.ymlを読み込んでいます" source = "main.go:250"

time = "2017-01-01T09:01:11 + 02:00" level = info msg = "シリーズマップとヘッドチャンクを読み込んでいます..." source = "storage.go:354"

time = "2017-01-01T09:01:11 + 02:00" level = info msg = "23 series loaded。" source = "storage.go:359"

time = "2017-01-01T09:01:11 + 02:00" level = info msg = " リスニング:9090 " source = "web.go:248"



prometheus.yml configはYAML言語で記述されますが、タブは好きではなく、スペースのみを使用する必要があります。 アドレスhttp:// localhost:57772からメトリックを取得し、アプリケーション/メトリック/キャッシュ(アプリケーションの名前は任意に選択されます)、つまり メトリックを収集するための最終アドレスはhttp:// localhost:57772 / metrics / cacheです。 ラベル「job = isc_cache」が各メトリックに追加されます。 ラベル-非常に大まかに言って、これはSQLのWHEREに類似しています。 私たちの場合、これは使用されませんが、サーバーの数が複数の場合は機能します。 たとえば、サーバー(および/またはインスタンス)の名前をラベルに保存したり、グラフを描画するラベルのパラメーター化されたクエリを保存したりできます。 Prometheusが動作していることを確認しましょう(上記の出力では、リッスンするポートが表示されています-9090):



画像



Webインターフェースが開いたため、Prometheusは動作しています。 ただし、当面はもちろん、Cachéメトリックスは表示されません([ステータス]→[ターゲット]をクリックして確認します)。



画像

メトリックの準備



私たちのタスクは、 http:// localhost:57772 / metrics / cacheで、Prometheusが理解できる方法でメトリックを収集できるようにすることです。 CachéのREST機能を使用するのは、その単純さのためです。 Prometheusは数値メトリックのみを理解するため、文字列メトリックはエクスポートしません。 テストメトリックを取得するには、 SYS.Stats.DashboardクラスのAPIを使用します。 これらのメトリックは、Caché自体がシステムツールバーを表示するために使用します。



画像



ターミナルでの同じ例
%SYS> set dashboard = ## class(SYS.Stats.Dashboard).Sample()

%SYS> zwriteダッシュボード

ダッシュボード= <オブジェクト参照> [2@SYS.Stats.Dashboard]

+ -----------------一般情報-| oref値:2

| クラス名:SYS.Stats.Dashboard

| 参照カウント:2

+ -----------------属性値-| ApplicationErrors = 0

| CSPSessions = 2

| CacheEfficiency = 280.03

| DatabaseSpace = "通常"

| DiskReads = 2317

| DiskWrites = 329

| ECPAppServer = "OK"

| ECPAppSrvRate = 0

| ECPDataServer = "OK"

| ECPDataSrvRate = 0

| GloRefs = 740953

| GloRefsPerSec = "166.00"

| GloSets = 60947

| JournalEntries = 403

...



USERエリアはサンドボックスとして機能します。 最初に、REST Webアプリケーション/メトリックを作成します。 少なくともある程度のセキュリティのために、パスワードを使用してアプリケーションへの入り口を示し、このWebアプリケーションに特定のリソースがあることも示します。PromResourceと呼びましょう。 リソースへのパブリックアクセスを閉じます。 つまり、次のことを行います。

%SYS> write ## class(Security.Resources).Create( "PromResource"、 "Resources for Metrics Webページ"、 "")

1


Webアプリケーションの設定:



画像



このリソースを使用できるユーザーが必要になります。 また、ユーザーは作業ベース(この場合はUSER)を読み取り、それに書き込む権限を持っている必要があります。 さらに、彼はCACHESYSシステムベースを読み取る権利が必要になります。これは、以下の実装コードで、%SYS領域に移動するためです。 標準的なスキーム、つまり これらの機能を持つPromRoleロールを作成してから、このロールを持つPromUserユーザーを作成します。 「秘密」などのパスワードを選択します。

%SYS> write ## class(Security.Roles).Create( "PromRole"、 "Role for PromResource"、 "PromResource:U、%DB_USER:RW、%DB_CACHESYS:R")

1

%SYS> write ## class(Security.Users).Create( "PromUser"、 "PromRole"、 "Secret")

1


この特定のPromUserユーザーを、Prometheus configで認証用に指定します。 次に、SIGHUPシグナルをサーバープロセスに送信して、構成を再読み取りします。



より安全な構成
#cat /opt/prometheus/prometheus-1.4.1.linux-amd64/prometheus.yml

グローバル:

scrape_interval:15s#スクレイプ間隔を15秒ごとに設定します。 デフォルトは1分ごとです。



scrape_configs:

-job_name: 'isc_cache'

metrics_path: '/メトリック/キャッシュ'

static_configs:

-ターゲット:['localhost:57772']

basic_auth:

ユーザー名: 'PromUser'

パスワード:「秘密」



#kill -SIGHUP $(pgrep prometheus) #またはkill -1 $(pgrep prometheus)



Prometheusは、メトリックWebアプリケーションを使用するための認証に成功しました。



メトリックは、my.Metrics RESTリクエストハンドラクラスによって提供されます。



ここにその実装があります
Class my.Metrics Extends %CSP.REST { Parameter ISCPREFIX = "isc_cache"; Parameter DASHPREFIX = {..#ISCPREFIX_"_dashboard"}; XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] { <Routes> <Route Url="/cache" Method="GET" Call="getMetrics"/> </Routes> } /// Output should obey the Prometheus exposition formats. Docs: /// https://prometheus.io/docs/instrumenting/exposition_formats/ /// /// The protocol is line-oriented. A line-feed character (\n) separates lines. /// The last line must end with a line-feed character. Empty lines are ignored. ClassMethod getMetrics() As %Status { set nl = $c(10) do ..getDashboardSample(.dashboard) do ..getClassProperties(dashboard.%ClassName(1), .propList, .descrList) for i=1:1:$ll(propList) { set descr = $lg(descrList,i) set propertyName = $lg(propList,i) set propertyValue = $property(dashboard, propertyName) // Prometheus supports time series database // so if we get empty (for example, backup metrics) or non-digital metrics // we just omit them. if ((propertyValue '= "") && ('$match(propertyValue, ".*[-A-Za-z ]+.*"))) { set metricsName = ..#DASHPREFIX_..camelCase2Underscore(propertyName) set metricsValue = propertyValue // Write description (help) for each metrics. // Format is that the Prometheus requires. // Multiline descriptions we have to join in one string. write "# HELP "_metricsName_" "_$replace(descr,nl," ")_nl write metricsName_" "_metricsValue_nl } } write nl quit $$$OK } ClassMethod getDashboardSample(Output dashboard) { new $namespace set $namespace = "%SYS" set dashboard = ##class(SYS.Stats.Dashboard).Sample() } ClassMethod getClassProperties(className As %String, Output propList As %List, Output descrList As %List) { new $namespace set $namespace = "%SYS" set propList = "", descrList = "" set properties = ##class(%Dictionary.ClassDefinition).%OpenId(className).Properties for i=1:1:properties.Count() { set property = properties.GetAt(i) set propList = propList_$lb(property.Name) set descrList = descrList_$lb(property.Description) } } /// Converts metrics name in camel case to underscore name with lower case /// Sample: input = WriteDaemon, output = _write_daemon ClassMethod camelCase2Underscore(metrics As %String) As %String { set result = metrics set regexp = "([AZ])" set matcher = ##class(%Regex.Matcher).%New(regexp, metrics) while (matcher.Locate()) { set result = matcher.ReplaceAll("_"_"$1") } // To lower case set result = $zcvt(result, "l") // _e_c_p (_c_s_p) to _ecp (_csp) set result = $replace(result, "_e_c_p", "_ecp") set result = $replace(result, "_c_s_p", "_csp") quit result } }
      
      







コンソールで、作業が無駄になっていないことを確認します(curlが進行状況バーに干渉しないように--silentキーが追加されました)。



メトリックのアンロードの確認
#curl --user PromUser:Secret --silent -XGET 'http:// localhost:57772 / metrics / cache' | 頭-20

#HELP isc_cache_dashboard_application_errors記録されたアプリケーションエラーの数。

isc_cache_dashboard_application_errors 0

#HELP isc_cache_dashboard_csp_sessions CSPセッションの最新の数。

isc_cache_dashboard_csp_sessions 2

#HELP isc_cache_dashboard_cache_efficiency最近測定されたキャッシュ効率(グローバル参照/(物理読み取り+書き込み))

isc_cache_dashboard_cache_efficiency 439.56

#HELP isc_cache_dashboard_disk_readsシステム起動後の物理ブロック読み取り操作の数。

isc_cache_dashboard_disk_reads 2605

#HELP isc_cache_dashboard_disk_writesシステム起動後の物理ブロック書き込み操作の数

isc_cache_dashboard_disk_writes 1021

#HELP isc_cache_dashboard_ecp_app_srv_rate最近測定されたECPアプリケーションサーバートラフィック(バイト/秒)。

isc_cache_dashboard_ecp_app_srv_rate 0

#HELP isc_cache_dashboard_ecp_data_srv_rate最新の測定されたECPデータサーバートラフィック(バイト/秒)。

isc_cache_dashboard_ecp_data_srv_rate 0

#HELP isc_cache_dashboard_glo_refsシステム起動以降のグローバル参照の数。

isc_cache_dashboard_glo_refs 1593830

#HELP isc_cache_dashboard_glo_refs_per_sec最近測定された1秒あたりのグローバル参照の数。

isc_cache_dashboard_glo_refs_per_sec 131.00

#HELP isc_cache_dashboard_glo_setsシステム起動後のグローバルセットとキルの数。

isc_cache_dashboard_glo_sets 132003



これで、Prometheusインターフェースを確認できます。



画像



メトリックのリストは次のとおりです。



画像



プロメテウス自体でそれらを見ることにこだわるつもりはありません。 希望する場合は、目的のメトリックを選択して、「実行」ボタンをクリックします。 [グラフ]タブを選択すると、グラフを表示できます(キャッシュ効率が表示されます)。



画像



メトリックの視覚化



グラフィック表示のために、 Grafanaを設定しました 。 この記事では、tarballからのインストールが選択されました。 しかし、パッケージからコンテナまで、多くのインストールオプションがあります。 示された手順を実行します(最初に/ opt / grafanaディレクトリを作成し、そこに移動します):



画像



構成はそのままにしておきましょう。 最後のステップでは、バックグラウンドでGrafanaを起動します。 Prometheusの場合のように、Grafanaの作業のログはファイルにリダイレクトされます。

#./bin/grafana-server> /var/log/grafana.log 2>&1&


GrafanaのWebインターフェースは、デフォルトでポート3000で使用可能です。ログイン/パスワード:admin / admin。



画像



GrafanaとPrometheusの友達を作る方法はここで説明されています 。 自分の言葉で言うと、-プロメテウスタイプの新しいデータソースを追加します。 直接/プロキシアクセスとして、オプションを選択します。



画像



次に、ダッシュボードに必要なパネルを追加します。 ダッシュボード生地のブランクは一般に入手可能です 。 メトリックを収集するためのクラスコードもあります。 Grafanaにダッシュボードをインポートするだけです(ダッシュボード→インポート):



画像



インポート後、次の図が表示されます。



画像



ダッシュボードを保存します。



画像



時間範囲と更新期間の選択は、右上で選択されます。



画像



監視の例



グローバルアクセスの監視をテストします。

USER> for i = 1:1:1000000 {set ^ prometheus(i)= i}

USER> kill ^プロメテウス


1秒あたりのグローバルへの参照数が増加し、キャッシュの効率が低下していることがわかります(キャッシュ内に^プロメテウスグローバルはまだありません)。



画像



ライセンスの使用を確認してください。 USERエリアにプリミティブなCSPページPromTest.cspを作成します。

<html>

<head> <title>プロメテウステストページ</ title> </ head>

<body>監視は正常に動作します!</ body>

</ html>


そして、n回目にアクセスします(アプリケーション/ csp /ユーザーがパスワードで保護されていないことを想定しています):

#ab -n77 http:// localhost:57772 / csp / user / PromTest.csp


ライセンスを含むこのような画像が表示されます。



画像



簡単な結論



ご覧のとおり、このような監視の導入は難しくありません。 すでに初期段階では、ライセンスの使用、グローバルキャッシュの有効性、アプリケーションエラーの存在など、システムに関する重要な情報を取得できます。 たとえば、 SYS.Stats.Dashboardクラスを取り上げましたが、SYS、%SYSTEM、%SYSパッケージの他のクラスも同様に注目に値します。 また、想像力と独自のクラスを作成する可能性を制限するものはありません。アプリケーションのメトリックの要求に応じて、たとえば、あるタイプまたは別のタイプのドキュメントの数を発行します。 Grafanaの別のテンプレートで、いくつかの有用なメトリックが計画されています。



続く



このトピックが興味深い場合は、フォローアップが続きます。 計画の内容:



  1. 記録デーモンの動作に関するメトリックを使用したGrafanaのテンプレートの準備。 いずれの場合でも、そのメトリックの一部について、ユーティリティ^ mgstatのグラフィカルな類似体を作成すると便利です。
  2. Webアプリケーションのパスワードは良好ですが、証明書を使用する可能性を確認したいと思います。
  3. Prometheus、Grafana、およびPrometheusの一部のエクスポーターの使用は、すでにDockerコンテナーの形式になっています。
  4. ディスカバリサービスを使用して、新しいCachéインスタンスをPrometheus監視に自動的に追加します。 ここでは、実際にテンプレートとしてこのような便利なGrafanaのものを示したいと思います。 これは、選択したサーバーに応じてメトリックのみが表示される動的パネルのようなものですが、すべて同じダッシュボードに表示されます。
  5. アラートマネージャープロメテウス。
  6. データ保持時間に関するPrometheus構成設定、および多数のメトリックと短い収集間隔を持つシステムの最適化オプション。
  7. 途中でポップアップするさまざまなニュアンス。


参照資料



この記事を準備する過程で、いくつかの便利な場所を訪れ、いくつかのビデオを見ました。





この行を読んでくれた人に感謝します!



PS 2番目の部分が追加されました。



All Articles