Metricbeatに入ったMSSQLモジュール(ベータ版)を使おう
概要
本日、Elastic Stack 7.0のWebinarがありました。そこでBeatsシリーズとして、Moduleのところで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 |
ダッシュボード
Performance
パフォーマンスに関するMetricのダッシュボードがこちら
APMと異なり、T-SQLごとのクエリ所要時間などが出るわけではないようです。
一方、キャッシュからヒットした率などはAPMでは取得できない内容なので、あわせて利用するのが良さそうです。
Transaction Log
トランザクションログに関するMetricのダッシュボードがこちら
こちらには、controlパーツがついています。 左上の方にあるプルダウンメニューから、絞り込みたいDBを選択したあと、「Apply changes」で、絞り込みを行うことができます。
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の方を見て欲しいです。
データべースも指定する版
じゃあ、データベースも指定してみようということで、パラメータに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.
ダメな書き方
ホスト名/インスタンス名 と書くのが正しいですが、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
終わりに
PaaSでDBを使っている人には、今一つ旨みがないかもしれません。 複数あるオンプレ環境でDBを立てていて、アプリケーションのログも、サーバ機のメトリクスも、DBとしてのメトリクスも1か所で統合してみたい! という用途に使えそうです。
クラウドも、オンプレもその差を意識せずにモニタリングできるようになると一番うれしいので、 mssqlのドキュメントでは、Microsoft SQL 2017と書いてあり、AzureもOKとは書いてないのですが、そのうち対応してくれると良いなぁ。