Metricbeatに入ったMSSQLモジュール(ベータ版)を使おう

概要

本日、Elastic Stack 7.0のWebinarがありました。そこでBeatsシリーズとして、ModuleのところでMSSQLがチラッと紹介されていました。

www.elastic.co

f:id:tsgkdt:20190423145117p:plain
mssql

最近では、APMの.NET Agentがベータ版として出てくるなど、Microsoft界隈の製品をお使いの方にもElasticがより身近になってきたように思います。

MSSQLモジュール

このモジュールを使うと、どんな可視化ができるようになるんでしょうか。
これを確認してみます。

大きくは2つのカテゴリのメトリクスを取得することができます。

  • transaction_log
  • performance

それぞれにVisualization、Dashboardがあるので、それを見ていきましょう。

標準で用意されるVisualization

標準で用意されているVisualizationのパーツがこちらです。

Title Type
Active size of transaction log [Metricbeat MSSQL] ECS Visual Builder
Batch Requests/sec [Metricbeat MSSQL] ECS Line
Buffer Cache Hit Ratio [Metricbeat MSSQL] ECS Line
Database selector [Metricbeat MSSQL] ECS Controls
Lock Waits/sec [Metricbeat MSSQL] ECS Line
Log space size since last backup [Metricbeat MSSQL] ECS Visual Builder
Percentage of used space of transaction log [Metricbeat MSSQL] ECS Visual Builder
Recovery size of transaction log [Metricbeat MSSQL] ECS Visual Builder
Total log space usage [Metricbeat MSSQL] ECS Visual Builder
Transaction log size since last checkpoint [Metricbeat MSSQL] ECS Visual Builder
Transactions [Metricbeat MSSQL] ECS Line
Used space of transaction log [Metricbeat MSSQL] ECS Visual Builder
User Connections [Metricbeat MSSQL] ECS Line

f:id:tsgkdt:20190423152232p:plain
visualization

ダッシュボード

Performance

パフォーマンスに関するMetricのダッシュボードがこちら

f:id:tsgkdt:20190423152551p:plain
mssql performance

APMと異なり、T-SQLごとのクエリ所要時間などが出るわけではないようです。
一方、キャッシュからヒットした率などはAPMでは取得できない内容なので、あわせて利用するのが良さそうです。

Transaction Log

トランザクションログに関するMetricのダッシュボードがこちら

こちらには、controlパーツがついています。 左上の方にあるプルダウンメニューから、絞り込みたいDBを選択したあと、「Apply changes」で、絞り込みを行うことができます。

f:id:tsgkdt:20190423153115p:plain
transaction_log

Metricbeatの設定

この設定を足せばmetricbeatの設定ファイルに足せば良いのですが、それだけだと芸がないので私が困った点を追加しておきます。

#-------------------------------- Mssql Module --------------------------------
- module: mssql
  metricsets:
    - "transaction_log"
    - "performance"
  hosts: ["sqlserver://sa@localhost"]
  period: 10s

パスワードに@が入ってるんです

パスワードの複雑性要件などで、記号や大文字小文字、英数字の組み合わせを使ったパスワードをお使いの方もいらっしゃると思います。 もし、@をパスワードに使っていたら・・・どう書けばよいの?

たとえば、こうなります。 PASSWORD: P@ssw0rd の場合。

 hosts: ["sqlserver://sa:P@ssw0rd@xxx.xxx.xxx.xxx"]

Microsoft Azure SQLDatabaseだったら

PaaSのSQL Serverの場合はどう書けるんですか、と。
通常は、Azure Monitorで見ることが多いと思いますが、もしMetricbeatでやるの場合は、どういう接続文字列にすれば良いんですか、という話です。

今回はSingle Databaseの構成で確認しています。

データべース指定しない版

hosts: ["sqlserver://ユーザ名:パスワード@*******.database.windows.net"]

Azureの管理画面の接続文字列のところにあるようにencrypt=true, TrustServerCertificate=falseのような設定をいれても、エラーにならず、Metricbeatは起動します。

hosts: ["sqlserver://ユーザ名:パスワード@*******.database.windows.net/?encrypt=true&TrustServerCertificate=false"]

この状態だと、システムデータベースのmasterを見てるので、あまりうれしくないですね。Single Databaseでたててるので、ユーザのたった1つのDatabaseの方を見て欲しいです。

f:id:tsgkdt:20190423163246p:plain

データべースも指定する版

じゃあ、データベースも指定してみようということで、パラメータにdatabase=を追加します。

  hosts: ["sqlserver://ユーザ名:パスワード@*******.database.windows.net/?database=データベース名&encrypt=true&TrustServerCertificate=false"]

起動時にエラーにはなりませんが、実際にElasticsearchに格納されたデータにはエラーとなっているデータがあります。
USEでデータベースを切り替えようとしてエラーになっているみたいです。 パフォーマンスの方のログは取れているようなので、このあたりは今後どうにかなるかもしれません。

error scanning single result: mssql: USE statement is not supported to switch between databases. Use a new connection to connect to a different database.

f:id:tsgkdt:20190423162123p:plain

ダメな書き方

ホスト名/インスタンス名 と書くのが正しいですが、AzureのSQLDatabaseのインスタンス名って何?と、うっかりDatabase名などを書いてしまうと、こういうエラーになります。

ダメな例

hosts: ["sqlserver://ユーザ名:パスワード@*******.database.windows.net/HogeTest?encrypt=true&TrustServerCertificate=false"]

出てくるエラーがこちら。

could not create connection to db: error doing ping to db: Unable to get instances from Sql Server Browser on host *******.database.windows.net: read udp xx.xx.xx.xx:49413->zz.zz.zz.zz:1434: i/o timeout; could not create connection to db

f:id:tsgkdt:20190423163811p:plain

終わりに

PaaSでDBを使っている人には、今一つ旨みがないかもしれません。 複数あるオンプレ環境でDBを立てていて、アプリケーションのログも、サーバ機のメトリクスも、DBとしてのメトリクスも1か所で統合してみたい! という用途に使えそうです。

クラウドも、オンプレもその差を意識せずにモニタリングできるようになると一番うれしいので、 mssqlのドキュメントでは、Microsoft SQL 2017と書いてあり、AzureもOKとは書いてないのですが、そのうち対応してくれると良いなぁ。