System.InvalidOperationException: HTTPS endpoints can only be configured using KestrelServerOptions.Listen().

目的

次のようなエラーが出た時になんとかする

System.InvalidOperationException:
    HTTPS endpoints can only be configured using KestrelServerOptions.Listen().

方法

  • UseUrlsでhttpのURLを指定する

サンプルコード

    return WebHost.CreateDefaultBuilder(args)
        .UseUrls("http://localhost:5000")
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseStartup<Startup>()
        .UseApplicationInsights()
        .Build();

参考リンク

Kestrel web server implementation in ASP.NET Core | Microsoft Docs

redcarpetとかnanocでヘッダが日本語でもアンカーが効くようにするには

目的

nanocなどで利用されているmarkdownの変換ツールredcarpetで

## 手順

などのように書いたヘッダに対して 以下のようなアンカーリンクを

[手順](#手順)
[手順](#%E6%89%8B%E9%A0%86)

書いたとしても、redcarpetはヘッダーのアンカーを作る際に非ASCII文字は取り除いてしまうのでうまく行かない。 というか、勝手なアンカーを作るので厄介である。 これをなんとかしたい。

方法

マルチバイト文字やHTMLタグはアンカーから削除され、ASCIIテキストのみが残るので、 アンカーに使いたいASCII文字列をHTMLタグで囲んで挿入すれば良い。 その文字列は、CSSやJSで表示表は消しておく。

サンプルコード

ヘッダの記述

## <span class="anchor-text-supplement">procedure</span>手順

リンク側の記述

[手順](#procedure)

CSS

.anchor-text-supplement {
  display: none;
}

参考リンク

Prometheusベストプラクティスのリンク集 - Prometheusドキュメント

このページはPrometheus公式ドキュメント和訳+αの一部です。

Robust Perception | Prometheus Monitoring Experts

参考リンク

おすすめ書籍

入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

和訳活動の支援

Prometheusドキュメント和訳が役に立った方は、以下QRコードからPayPayで活動を支援して頂けるとありがたいです。

PayPayによる支援用QRコード
上のQRコードからPayPayによる支援

標準出力を捨てて標準エラーだけパイプで渡すには ​

目的

​ 例えば、以下のようなプログラムがあったとして、"error"だけリダイレクトしたい ​

bin/stdouterr.rb

STDOUT.puts "data"
STDERR.puts "error"

方法

  • サブシェルで標準出力を/dev/nullに捨てる
  • サブシェルの標準エラーをリダイレクトする ​
(ruby bin/stdouterr.rb > /dev/null) 2>&1 | less

​ ​

jobの分け方ベストプラクティス - Prometheusドキュメント

このページはPrometheus公式ドキュメント和訳+αの一部です。

jobラベルは何のためにあるか?

jobラベルはターゲットに必ず付いているラベルの1つである。どうこれを使うことができるか?

jobラベルは、ターゲットのリラベルの後でjobラベルがなければ設定項目job_nameが利用されるので、特別である。 このようにしてターゲットは必ずjobラベルを持つことになる。

では、どうやってこれを最大限に活用するべきか? オススメは、同じことをするアプリケーション(これはほぼ常に、同じバイナリを完全に同じ設定で動かしているプロセスのことを意味している)を整理するためにjobラベルを使うことである。 例えば、job="frontend"でwebのフロントエンドがあり、job="redis"でキャッシュとして利用されるRedisがあるとする。 このようなラベルを利用すると、jobに渡って集約することが容易になる。 例えば、jobあたりのCPU利用率はsum by (job)(rate(process_cpu_seconds_total[5m]))となるだろう。 これに対して、Kubernetes上で動くプロセス全てにjob="kubernetes"を付けても特に役に立たない。もっと意味のあるjobラベルを目指すべきである。

もし、異なる目的に対して異なるRedisサーバー群を稼働させているなら、それぞれのサーバー群に対して異なるjobラベルを付けるのが理にかなっているだろう。 それぞれのサーバー群は結局、異なるパフォーマンス特性を持つ可能性が高く、それらを一緒くたに集約して役に立つことは恐らくないだろう。 もし、サーバー群に下位区分(シャーディングなど)があるなら、shardや類似のラベルを追加してジョブを区分するのが多くの場合理に適っている。

避けるべきなのは、プロセスのバイナリと設定のようなもの以上の情報をjobラベルで表現することである。 例えば、本番環境を開発・ステージング環境から区別するには、job="redis_production"とするのではなく、別にenv="production"を付ける方が良いだろう。 これによって、ラベル値に対する正規表現に頼る必要なしに、環境を跨いだ計算が簡単になる。

翻訳元

おすすめ書籍

入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

テンプレートの例 - Prometheusドキュメント

このページはPrometheus公式ドキュメント和訳+αの一部です。

TEMPLATE EXAMPLES

Prometheusは、コンソールページと同様に、アラートのアノテーションとラベルでテンプレートをサポートしている。 テンプレートで、ローカルのデータベースに対してクエリを実行したり、繰り返し処理、条件分岐、フォーマットなどをすることが出来る。 Prometheusのテンプレート言語はGoのテンプレートシステムに基づいている。

Simple alert field templates

alert: InstanceDown
expr: up == 0
for: 5m
labels:
  severity: page
annotations:
  summary: "Instance {{$labels.instance}} down"
  description: "{{$labels.instance}} of job {{$labels.job}} has been down for more than 5 minutes."

アラートのフィールドのテンプレートは、起きたアラートそれぞれに対して各ルールに対する反復処理の中で実行されるので、どのクエリも軽量に保つこと。 アラートのためにより込み入ったテンプレート必要な場合、代わりにコンソールへリンクすることを推奨する。

単純な繰り返し

インスタンスのリストとそれがupかどうかのリストを表示する。

{{ range query "up" }}
  {{ .Labels.instance }} {{ .Value }}
{{ end }}

特殊変数.は、各ループでのサンプル値が含まれる。

値の表示

{{ with query "some_metric{instance='someinstance'}" }}
  {{ . | first | value | humanize }}
{{ end }}

GoおよびGoのテンプレート言語はどちらも強く型付けされているので、実行エラーを避けるためにサンプルが返されたことをチェックしなければならない。 例えば、スクレイプやルールの評価がまだ実行されていないあるいはホストがダウンしている場合にこうしたことが起きる。

インクルードされたテンプレートprom_query_drilldownはこの処理をし、結果をフォーマットし、expressionブラウザにリンクする。

コンソールURLパラメーターの利用

{{ with printf "node_memory_MemTotal{job='node',instance='%s'}" .Params.instance | query }}
  {{ . | first | value | humanize1024}}B
{{ end }}

console.html?instance=hostnameとしてアクセスされると、.Params.instanceは、hostnameになる。

高度な繰り返し

<table>
{{ range printf "node_network_receive_bytes{job='node',instance='%s',device!='lo'}" .Params.instance | query | sortByLabel "device"}}
  <tr><th colspan=2>{{ .Labels.device }}</th></tr>
  <tr>
    <td>Received</td>
    <td>{{ with printf "rate(node_network_receive_bytes{job='node',instance='%s',device='%s'}[5m])" .Labels.instance .Labels.device | query }}{{ . | first | value | humanize }}B/s{{end}}</td>
  </tr>
  <tr>
    <td>Transmitted</td>
    <td>{{ with printf "rate(node_network_transmit_bytes{job='node',instance='%s',device='%s'}[5m])" .Labels.instance .Labels.device | query }}{{ . | first | value | humanize }}B/s{{end}}</td>
  </tr>{{ end }}
<table>

ここでは、全ネットワークデバイスについて繰り返し処理をして、それぞれのネットワークトラフィックを表示している。

rangeアクションが変数を指定していないので、.がループ変数となり、ループ内では.Params.instanceは利用できない。

再利用可能なテンプレートの定義

Prometheusは、再利用可能なテンプレートの定義をサポートしている。 これはコンソールライブラリと組み合わせると特に強力で、複数のコンソールにまたがってテンプレートを共有出来るようになる。

{{/* Define the template */}}
{{define "myTemplate"}}
  do something
{{end}}

{{/* Use the template */}}
{{template "myTemplate"}}

テンプレートは、引数が1つに制限されている。複数の引数をまとめるために、関数argsを利用することが出来る。

{{define "myMultiArgTemplate"}}
  First argument: {{.arg0}}
  Second argument: {{.arg1}}
{{end}}
{{template "myMultiArgTemplate" (args 1 2)}}

参考リンク

おすすめ書籍

入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

和訳活動の支援

Prometheusドキュメント和訳が役に立った方は、以下QRコードからPayPayで活動を支援して頂けるとありがたいです。

PayPayによる支援用QRコード
上のQRコードからPayPayによる支援

コンソールテンプレート - Prometheusドキュメント

このページはPrometheus公式ドキュメント和訳+αの一部です。

コンソールテンプレート

コンソールテンプレートによって、Go templating languageで書かれた任意のコンソールを作成することができる。

コンソールテンプレートは、簡単にバージョン管理できるテンプレートを作成する最も強力な方法である。ただ、学習コストは高いので、このスタイルの監視に慣れていないユーザーは、まずGrafanaを試すのが良い。

Getting started

Prometheusには、コンソールのサンプルセットがある。これらは稼働しているPrometheusの/consoles/index.html.exampleで見ることができ、 Node Exporterがjob="node"というラベルでscrapeしているなら、Node Exporterのコンソールを表示する。

このサンプルコンソールは、5つの部分からなる

  • 上部のナビゲーションバー
  • 左側のメニュー
  • 下部の時間コントロール
  • 中央のメインコンテンツ(普通はグラフ)
  • 右側の表

ナビゲーションバーは、他のPrometheusなどの他システム、ドキュメントなどへのリンクである。メニューは、そのPrometheusサーバー自体の中のナビゲーションに用い、コンソールを新しいタブで開いて情報の相互関連性を見るために便利である。どちらもconsole_libraries/menu.libで設定することが出来る。

時間コントロールによって、グラフの間隔と幅を変更することが出来る。コンソールのURLは共有することが出来て、他の人にも同じグラフを表示する。

メインコンテンツは、普通はグラフである。設定可能なJavaScriptのグラフライブラリが提供されていて、PrometheusからのデータのリクエストとRickshawを通した描画が出来る。

最後に、右側の表は、グラフよりコンパクトに統計情報を表示するために利用できる。

サンプルコンソール

これは、基本的なコンソールで、右側の表にタスクの数、いくつのタスクがupか、平均メモリ使用量を表示し、メインコンテンツとして毎秒のクエリ数のグラフを表示する。

{{template "head" .}}

{{template "prom_right_table_head"}}
<tr>
  <th>MyJob</th>
  <th>{{ template "prom_query_drilldown" (args "sum(up{job='myjob'})") }}
      / {{ template "prom_query_drilldown" (args "count(up{job='myjob'})") }}
  </th>
</tr>
<tr>
  <td>CPU</td>
  <td>{{ template "prom_query_drilldown" (args
      "avg by(job)(rate(process_cpu_seconds_total{job='myjob'}[5m]))"
      "s/s" "humanizeNoSmallPrefix") }}
  </td>
</tr>
<tr>
  <td>Memory</td>
  <td>{{ template "prom_query_drilldown" (args
       "avg by(job)(process_resident_memory_bytes{job='myjob'})"
       "B" "humanize1024") }}
  </td>
</tr>
{{template "prom_right_table_tail"}}


{{template "prom_content_head" .}}
<h1>MyJob</h1>

<h3>Queries</h3>
<div id="queryGraph"></div>
<script>
new PromConsole.Graph({
  node: document.querySelector("#queryGraph"),
  expr: "sum(rate(http_query_count{job='myjob'}[5m]))",
  name: "Queries",
  yAxisFormatter: PromConsole.NumberFormatter.humanizeNoSmallPrefix,
  yHoverFormatter: PromConsole.NumberFormatter.humanizeNoSmallPrefix,
  yUnits: "/s",
  yTitle: "Queries"
})
</script>

{{template "prom_content_tail" .}}

{{template "tail"}}

prom_right_table_headprom_right_table_tailテンプレートは、右側の表を含んでいる。これは必須ではない。

prom_query_drilldownは、渡された式を評価し、フォーマットし、expression browserの式へリンクするテンプレートである。 第1引数が式で、第2引数は単位、第3引数は出力のフォーマット方法である。第1引数のみ必須である。

prom_query_drilldownの第3引数の正当な出力フォーマットは以下の通り。

  • Not specified: Default Go display output.
  • humanize: 結果をSI接頭辞を用いて表示
  • humanizeNoSmallPrefix: 1より大きな値はSI接頭辞を用いて表示、1より小さな値は3桁表示。これは、humanizeで生成されるmilliqueries per secondのような単位を避けるために便利である
  • humanize1024: 1000ではなく1024を底としたhumanize同様の表示をする。これは、KiBMiBのような単位を生成するために、Bを第2引数にしたときによく利用される。
  • printf.3g: 3桁表示

カスタムのフォーマットも定義できる。サンプルは、prom.libを参照のこと。

グラフライブラリ

グラフライブラリは次のように呼び出す。

<div id="queryGraph"></div>
<script>
new PromConsole.Graph({
  node: document.querySelector("#queryGraph"),
  expr: "sum(rate(http_query_count{job='myjob'}[5m]))"
})
</script>

headテンプレートが必要なJavaScriptCSSをロードする。

グラフライブラリのパラメーター

  • expr
    • Required.
    • グラフにする式。リストも可
  • node
    • Required.
    • 描画するためのDOMノード
  • duration
    • Optional.
    • グラフの期間。デフォルトは1時間
  • endTime
    • Optional.
    • グラフの最後のunixtime。デフォルトは現在
  • width
    • Optional.
    • グラフの幅(タイトルを除く)。デフォルトは、自動検出
  • height
    • Optional.
    • グラフの高さ(タイトルと凡例を除く)。デフォルトは200ピクセル
  • min
    • Optional.
    • X軸最小値。デフォルトは、データの最低値。
  • max
    • Optional.
    • Y軸最大値。デフォルトは、データの最高値。
  • renderer
    • Optional.
    • グラフの種類。lineまたはarea。デフォルトは、line
  • name
    • Optional.
    • 凡例とhover detailで使われるプロットのタイトル。文字列が渡された場合、[[ label ]]はラベルの値で置換される。関数が渡された場合、ラベルのマップが渡されるので、文字列として名前を返すこと。リストも可
  • xTitle
    • Optional.
    • X軸のタイトル。デフォルトはTime
  • yUnits
    • Optional.
    • Y軸の単位。デフォルトは、空。
  • yTitle
    • Optional.
    • Y軸のタイトル。デフォルトは、空。
  • yAxisFormatter
    • Optional.
    • Y軸の数値のフォーマッター。デフォルトは、PromConsole.NumberFormatter.humanize
  • yHoverFormatter
    • Optional.
    • hover detailの数値のフォーマッター。デフォルトは、PromConsole.NumberFormatter.humanizeExact
  • colorScheme
    • Optional.
    • プロットで利用されるカラースキーム。hex color codeのリストまたはRickshawでサポートされているカラースキーム名。デフォルトは、'colorwheel'

exprnameの両方がリストの場合、両者は同じ長さでなければならない。nameは、対応する式のプロットに適用される。

yAxisFormatteryHoverFormatterの正当なオプションは以下の通り。

  • PromConsole.NumberFormatter.humanize: SI接頭辞を用いたフォーマット
  • PromConsole.NumberFormatter.humanizeNoSmallPrefix: 1より大きな値はSI接頭辞を用いてフォーマット、1より小さな値は3桁を用いたフォーマット。これは、humanizeで生成されるmilliqueries per secondのような単位を避けるために便利である
  • PromConsole.NumberFormatter.humanize1024: 1000ではなく1024を底としたhumanize同様のフォーマット

参考リンク

おすすめ書籍

入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

和訳活動の支援

Prometheusドキュメント和訳が役に立った方は、以下QRコードからPayPayで活動を支援して頂けるとありがたいです。

PayPayによる支援用QRコード
上のQRコードからPayPayによる支援