TimescaleDB + Grafana で 時系列データを可視化する
TimescaleDB と Grafana
TimescaleDB とは?
- PostgreSQL の EXTENSION の 時系列データベース
- Apache License v2 で公開されているOSS
Grafana とは?
TimescaleDB と Grafana の組み合わせ
Grafana v5.3 で TimescaleDB への対応が機能追加されました。
この機能追加により TimescaleDB に格納した時系列データを Grafana を使って可視化できるようになりました。
こちらの内容を触ってみたので、書き留めておきます。
TimescaleDB、Grafana の セットアップログ
TimescaleDB/Grafanaともに、公式ドキュメントに、ディストリビューション毎のセットアップ手順が記載されていつので、そちらを確認してください。
私は Ubuntu Server 18.04 LTS 上にオールインワンで構築してみました。そのログを置いておきます。
(インストールバージョン)
※ 2018年10月頃にセットアップしたので、現在の最新バージョンより古め(TimescaleDBもv0.xx)です。手順は基本的には一緒だと思うのですが、正しくは公式ドキュメントを参照してください。
① PostgreSQL の インスト―ル
② TimescaleDB の インスト―ル
③ postgresql.conf の設定変更
④ postgresユーザのパスワード設定しておく ユーザ/postgresqlの両方
試用なので、postgresユーザ&パスワードpostgresで接続しています。
⑤ TimescaleDB用 の データベース 作成
⑥ Grafana のインストール
⑦ Grafana のセットアップ
- http://(対象サーバ):3000 にログイン
- http://(対象サーバ):3000/datasources よりデータソースを登録する
(設定例)
(標準)
Name: 任意のデータソース名、Default: お好みで設定、Type: PostgreSQL
(PostgreSQL接続)
Host: サーバ+ポート、Database: 対象のDB名、User: 接続ユーザ、Password: 接続ユーザのパスワード、SSL Mode: 接続時のSSL利用
(PostgreSQL詳細)
Version: PostgreSQLのバージョン、TimescaleDB: チェックする、Min time interval: お好みで設定
TimescaleDB に デモ用のログを投入
Webサーバへのアクセスログを想定したデモ用のログを生成してみます。
(保有カラム)
- time: 日時
- http_host: { first.com, second.com, third.com }
- schema: { http, https }
- http_status: { 1xx, 2xx, 3xx, 4xx, 5xx }
TimescaleDB用のテーブルの作成
データ投入するテーブルを作成します。
HyperTableを作成します。(テーブルが空でないと作成できません)
デモ用ログ投入実行
雑にランダムなデータを作成 して 投入しました。
テーブルに格納されたログを確認
Grafanaで可視化
ダッシュボード の Edit で 登録します。デフォルトのMetricではGUIベースで登録できます。
SQLで記述する場合 Toggle Edit Mode を選択します。
上記は、通常の関数countを使っています。こちらでグラフを描画すると、下記のようになりした。
TimescaleDBの関数を用いて可視化
TimescaleDBには強力な関数が複数存在します。その一部を試してみます。
① 時系列最後尾のデータを取得
② 丸め時間 15分で集計
TimescaleDB と Grafana を組わせて使う紹介でした。
nginx 1.15.10 + njs で ssl_certificate, ssl_certificate_key に変数内のデータをロードする
nginx ngx_http_ssl_module 関連記事
この記事の概要
nginx 1.15.10 の Changes に 下記の Feature が 書かれていました 。
( http://nginx.org/en/CHANGES より抜粋 )
ssl_certificate, ssl_certificate_key に変数内のデータが利用できようになりました。この件について、動作検証した結果、njs との組み合わせで動作可能なことを確認したので、その内容について、書き留めておきます。
nginx.org のドキュメント に 下記の記述が追記されていました。
( http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate より抜粋 )
これまでの nginx バージョンの ssl_certificate, ssl_certificate_key においては、ファイル名 を指定して ファイル経由でデータをロードしていましたが、1.15.10 からは data:$変数名 という記述を使って変数内のデータをロードできるようになりました。
変数の定義方法について、njs で試した理由
この件の ユースケース について、 nginx forum 内で Maxim Dounin さんが下記の内容を発言されていました。
( https://forum.nginx.org/read.php?2,283522,283536#msg-283536 より抜粋 )
- ngx_http_perl_module
- ngx_http_js_module
- ngx_http_keyval_module (このmoduleに関してはcommercial subscriptionです)
などと組み合わせて使うことが意図されているとのことです。
ここに挙げられている 3つ以外でも nginx変数に値がセットできるなら動作するのでは?と思ったので、set (http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#set) を試してみたのですが、
SSLハンドシェイク時点ではnginx変数内に値が設定できていないという旨の下記のようなエラーが出力されました。この挙動からは、この記述パターンにおける set は処理順序がSSLハンドシェイクより後だと思われます。(個人的な推定です)
また、lua_nginx_module の ngx.var.VARIABLE を使ってnginx変数の設定するということも試みてみましたが、こちらも同様に、SSLハンドシェイクより前にnginx変数に値を設定することができませんでした。
こちらについては下記のドキュメントベースの情報としても、ngx.var.VARIABLE が利用可能な directive としては、SSLハンドシェイク前にフック可能なタイミングに利用できるなものが(現時点では)存在しないことを確認しました。
- 逆引きlua-nginx-module · GitHub
- GitHub - openresty/lua-nginx-module: Embed the Power of Lua into NGINX HTTP servers
という経緯から、ユースケースとして挙げられていたものの1つである njs (ngx_http_js_module) を使って、今回の検証を実施しました。
検証の準備
① ngx_http_js_module の取得&配置
ngx_http_js_module は デフォルトではビルドされていません。公式の手順などを参考に取得&配置しました。
② moduleのロードの記述
ngx_http_js_module は、動的モジュールのため下記のような記述でロードします。
③ httpディレクティブの記述
④ httpディレクティブ または serverディレクティブ の記述
⑤ jsファイルの用意
動作検証の内容と結果
今回も、workerを1つにし、そのworkerに対して straceで挙動を確認しつつ、ログを確認しつつ、接続確認を行いました。
① nginx reload 時 に jsファイルがロードされることを確認
② 初回アクセスする ( 初回ハンドシェイク )
③ jsファイルを書き換え (reloadしない)、再度アクセスする
故意に不正な証明書/鍵のデータに書き換えます。
挙動:https://(テストドメイン名) が適切に表示される
straceのログを見ていると②とフローが一致している。よって、jsファイルはreload時にのみ読み込まれるという挙動が推定できる。
④ reload の実行し、再度アクセスする
挙動:証明書/鍵が不正だという旨のエラーになる
jsファイルはreload時にのみ読み込まれるという挙動であると推定できる。
また、冒頭に紹介した nginx.org のドキュメントにも記載されていますが、error_logに証明書や鍵の中身が出力されるので扱いに注意が必要そうです。
nginx 1.15.10 + njs を使って、ssl_certificate, ssl_certificate_key に変数内のデータをロードする検証をした紹介でした。
# SSLハンドシェイクより前に nginx変数に設定できるのであれば njs 以外の他の方法でも試せそうです。
PreseedによるUbuntu Server自動インストール / early_command で実行可能な内容の調査メモ
Kickstartの%pre と Preseedのearly_command
事前設定ファイルを用いて、OS自動インストールをする仕組みとして、
が利用できます。
その設定ファイル内でコマンド・スクリプト実行を記述することができます。
そのなかでもパーティショニング前のスクリプト実行を定義する記述は下記になります。
%pre-%end セクション
preseed/early_command : preseed読み込み後できるだけ早いタイミングで実行
partman/early_command : パーティショニング直前に実行
このタイミングでのコマンド実行が活躍するシーンの例としては、
などが挙げられます。
early_commandで実行可能なコマンドの確認方法
Kickstartの%pre-%endセクションについては下記の RedHatのドキュメントに実行可能なコマンドのリストが記述されていました。標準的なコマンド一式が実行可能です。
一方Preseedのearly_commandについては、ドキュメントを確認したものの、なかなか実行可能なコマンドに言及している記述を見つけることができませんでした。
という経緯から調査していたので、ここに確認した情報を書き留めておきます。
① debian-installerの処理順序の確認
Debian Installerの内部処理については下記のドキュメントに纏められています。
debian-installerではパーティショナ起動前の処理では、メモリ上にロードしているのはdebian-installerの追加コンポーネントぐらいなので、early_commandで実行可能なコマンドは、メモリ上に展開されているinitrd(bootイメージ)に梱包されているコマンドと推測できます。
② initrdに梱包されているコマンドを確認
というわけで、梱包されているコマンドを確認するため、initrd(bootイメージ)を展開します。以降はUbuntu Server LTS 18.04のイメージで確認しています。
次項でコマンドの一覧をまとめましたが、実際に自分でinitrdを開封して詳細な中身を確認したいという方は、下記の内容を参考に、開封してください。
early_commandで実行可能なコマンド一覧
前項の方法で調べた内容の一覧です。
パーティショナ起動前のスクリプト実行(手動コマンド発行)
early_commandで記述する前にパーティショナ起動前のinitrd環境にログインして手動コマンド発行で動作確認しておくと便利そうでした。
- pxeboot で preseedを指定しない状態でbootする
- debian-installer の load conponent 直後に<Go back>でmenuへ抜ける
- この状態で Execute a shell を選択
- <Continue>でshellログイン
ここでスクリプト化する内容の動作確認が試せて、便利そうでした。
なお、この環境下においては、エディタはnano、シェルはashです。
パーティショナ起動前のスクリプト実行(Preseedのearly_command)
Preseed内でのearly_commandでの動作確認をしていたところとして、最終行が正常終了(ステータス0)だと正常終了とみなされてしまうという挙動を確認しました。
なので、直接スクリプトを記述せずに、スクリプトダウンロードののち最終行で実行という流れで記述すると良さそうでした。
またスクリプトについてはashスクリプトとしてのエラーハンドリングの仕方を意識する必要があります。
今回は Preseed の early_command で実行できる内容について、紹介しました。
実行可能なコマンドを移植するという内容についても現在実験中です。こちらについても、うまく動作できれば、別途紹介しようと思います。
nginx 1.15.9 の ssl_certificate, ssl_certificate_key の挙動確認
nginx ngx_http_ssl_module 関連記事
この記事の概要
nginx 1.15.9 で ssl_certificate, ssl_certificate_key に変数が使えるようになりました。
この変更により証明書・秘密鍵の動的な読み込みが可能になったのでは?と話題になっていました。
この件について、ちょうど挙動を確認したので、書き留めておきます。
深追いはできてないので、参考までに。
nginx.orgのドキュメントに記述が追記されていました。
そのなかで下記の忠告が書かれていました。
変数を使用すると、SSLハンドシェイク毎に 都度証明書(と鍵)がロードされ、パフォーマンスにはネガティブな影響を与えるようです。
パフォーマンスについては未だ計測できてないのですが、この都度ロードされるという挙動について確認してみました。
検証の準備
■serverディレクティブの記述
・[set $(任意の変数名) $(http_hostなどの識別名としてつかう組込変数)]を定義
・定義した任意の変数名を ssl_certificate や ssl_certificate_key にパスの一部として渡します
※ssl_certificate や ssl_certificate_keyに直接$(http_hostなどの識別名としてつかう組込変数)を書くのはNGでした。(file open対象がnil値になります)
■Let's Encryptで証明書&鍵を準備(2セット)
片系を退避 (動作確認を分かりやすくするため)
検証の内容と結果
workerを1つにしそのworkerに対して straceで挙動を確認しつつ、ログを確認しつつ、接続確認を行いました。
この間、 nginx の reload, restart は行わず、動的更新に対しての動作を確認しています。
① https://xxx.1773.work/ への初回アクセス
挙動:https://xxx.1773.work/が表示され 適切な証明書が表示される
② https://xxx.1773.work/ への2度目のアクセス(再ハンドシェイク)
挙動:https://xxx.1773.work/が表示され 適切な証明書が表示される
straceのログを見ていると①とフローが一致。
ドキュメント記述の通り、SSLハンドシェイク毎に 都度証明書(と鍵)がロードされる という動作を確認しました。
③ https://yyy.1773.work/ へのアクセス (証明書未配置のパス)
挙動:SSLハンドシェイク失敗
誘導先の証明書(鍵)パスが存在していないとエラーに。
④ https://yyy.1773.work/ へのアクセス (証明書の動的追加)
証明書追加を行います。
挙動:https://yyy.1773.work/ が表示され 適切な証明書が表示される
straceのログを見ていると①②とフローが一致。
reloadを伴わない動的追加が可能そうです。
⑤ https://yyy.1773.work/ へのアクセス (証明書の動的削除)
今度は、証明書を削除します。
挙動:
(1) keepaliveが切れるまではhttps://yyy.1773.work/ が表示され 適切な証明書が表示される
(2) 再SSLハンドシェイク時より ハンドシェイク失敗する
今回は、これらのざっくりとした挙動を確認してみました。
Ansible で 動的リストをつかって 一部の処理をループ実行する
この記事の概要
Ansible の playbook を使って、
① 対象サーバからリスト(インターフェース一覧など)を取得する
② そのリストの項目毎に一部の処理をループ実行する
ということを、1回のplaybook実行でできる記述方法を模索していたところ、とあるアプローチに至ったので、その手法を書き留めておきます。
変数に定義するのはつらいリスト(流動的 or 膨大な量)に対して処理を実行したいときに使えそうな方法なのではないかと思っています。
実行バージョンによる留意事項
私が試した Ansible バージョンは 2.6.2です。
記事内の記述は、バージョン 2.4 以降の Action である import_tasks と include_tasks をつかって記述しています。
バージョン 2.6.2だとまだ include でも記述可能ですが、下記のような include は 2.8で無くなる という旨の警告が出力されます。
バージョン 2.1以降~2.4未満で記述する場合は、逆に include を使わないとsyntax errorになる はずですので、
下記に記述する手法の import_tasks と include_tasks を include に置き換えて頂くと、同様の動作をすると思われます。
playbook の記述例と解説
さて、本題です。playbook の記述例 です。
※ ansible.cfg、hosts、install.yml については今回の説明に内容の例示が不要ですので割愛させていただきます。
わたしが例で示したリスト取得コマンドの実行結果の例はこのような内容です。
これを、with_items: <レジスタ名>.stdout_lines で呼ぶと リストの各行を 1 item として setup.yml をループ実行させることができます。
今回は、分かりやすいようにechoするだけにしてみます。
playbook の実行結果
さて、このplaybookを実行してみます。
実行処理の順序は下記のようになりました。
このように 動的リストをつかって 一部の処理をループ実行させることができました。