Zabbix-AgentによるSQLServerのLogspace使用率監視について

Zabbix-AgentによるSQLServerのLogspace使用率監視について

 

ZabbixODBC接続がなぜかうまくいかず、UserParamataer調査含めとても苦労したので、同じように苦労されている方の助けになれば幸いです。

 

+ 実現したいこと 目標

- Logspaceの容量をZabbixで監視し、閾値でメールを飛ばす。

- (そのうちやる)閾値でバックアップへ移動させる。


+ 環境


- Zabbix Server
OS:CentOS
Zabbix:3.2
Zabbix-Agent:3.2

- SQLServer
OS:WindowsServer2012
DB:SQLServer2012


ZabbixAgentのUserParameterに以下の値を設定している。

UserParameter=MSSQL.LogSpace[*],"C:\Program Files (x86)\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\SQLCMD.EXE" -S 【サーバー名】 -U 【ユーザ名】 -P 【パスワード】 -h -1 -W -Q "set nocount on CREATE TABLE #log (DbName varchar(256),Size float,Used float,Status int) INSERT INTO #log EXEC ('DBCC SQLPERF(LOGSPACE)WITH NO_INFOMSGS') SELECT log.Used FROM #log log where log.DbName = '$1' DROP TABLE #log"

 

書式:
UserParameter=<key(Zabbixでキーにする値)[引数]>,<command(ZabbixAgentが実行するコマンド>

<key[*]>=
MSSQL.LogSpace[*]
<command>=
"C:\Program Files (x86)\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\SQLCMD.EXE" -S 【サーバー名】 -U 【ユーザ名】 -P 【パスワード】 -h -1 -W -Q "set nocount on CREATE TABLE #log (DbName varchar(256),Size float,Used float,Status int) INSERT INTO #log EXEC ('DBCC SQLPERF(LOGSPACE)WITH NO_INFOMSGS') SELECT log.Used FROM #log log where log.DbName = '$1' DROP TABLE #log"

 

※今回のコマンドはSQLCMDを使用するため、SQLCMD.EXEの場所をフルパスで指定してある。
※ZabbixAgentの環境変数として登録してあればフルパスは不要かもしれない。

 

SQLCMDの引数
-S : サーバー名
-U : ログインユーザ名
-P : ログインパスワード
-h : -1 でヘッダー非表示
-W : 出力結果の余白削除
-Q : 実行するクエリを記載

 

実行するSQLの説明
SET NOCOUNT ON
 出力結果に(1件処理しました。)というような情報を非表示してくれる。
 Zabbixにて取得する際にこれを入れないと数値として受け取れない。

 

CREATE TABLE #log (DbName varchar(256),Size float,Used float,Status int)
 DBCCの結果が素直にSelectすることができないため、一時テーブルを作成し、そこへ格納する必要がある。

 

INSERT INTO #log EXEC ('DBCC SQLPERF(LOGSPACE)WITH NO_INFOMSGS')
 作成した一時テーブルにDBCCの結果を格納している。
 DBCC SQLPERF(LOGSPACE)
  LOGSPACEの値を取得するSQL
 WITH NO_INFOMSGS:
  出力結果にDBCCのメッセージを出力しないようにするオプション
  これがないとZabbixに余計な文字列が入ってしまう。

 

SELECT log.Used FROM #log log where log.DbName = '$1'
 ここでやっと対象のLOGSPASEの値をSELECT可能。
 $1:引数をこれで利用できる。

 

DROP TABLE #log
 一時テーブルなのでドロップは不要なのかもしれないが、念のためドロップしている。

JmeterにてCSRF(XSRF)対策が実装されているAngular.jsのシナリオを作成するためのポイント

SET-Cookie正規表現抽出で引っ張って変数に格納して利用する。

結論を先に書くとこういうことです。

 

なかなか調べても見つからなかったのでメモ。

 

元々やりたかったのは、Angular.jsを使用したシステムへの負荷テスト。

 

今回初めて採用したので負荷テストも手探りであった。

 

Jmeterのレスポンスにどうしてもエラーが返ってきてしまうのは、いったい何が原因なのかがさっぱりであった。

 

Cookieは、クッキーマネージャにより引き継ぐようにしているし、リクエストのCookieにもちゃんと格納されている。

と思ってgoogleChromeの開発者機能(F12)を利用してみることに。

 

 

と、気が付く。

 

Cookieの他に、ヘッダーにもパラメータいるんか―い。と。

 

ここからCookieの情報をシナリオに使うための方法探しの旅が始まった。

 

全然Cookieを変数に格納する方法が見つからないのですよ!

Jmeter Cookie 変数】

と検索してもHITするのはクッキーマネージャを利用する方法ばかり・・・。

 

やっとというか諦めて英語のサイトを探し始めるわけですよ!

そして見つけた内容は以下の通り。

 

正規表現抽出を利用し、

 

Refrence Name:変数名

Regular Expression:Set-Cookie: XSRF-TOKEN=(.+?);

Template:$1$

 

としてやれば変数にXSRF-TOKENの値が格納されるので、

これいこうのシナリオでヘッダーにパラメータとして使用してやればいいということでした。

 

正規表現抽出の説明や、Chromeの開発者機能について、Jmeterについての個人的なポイントはまた随時まとめていきます。

 

 

Timestamp型のカラムにinsertするための日付フォーマットはなに?

備忘録として書いておきます。

 

DB接続ツールはいろいろ(Access、黒猫SQL、A5SQL、CSE…)ありますが、それらのツールにおいて、直接テーブルの値を編集するのではなく、SQLを書いてデータを登録・更新しなければならない場合も多い。

 

その際に、よくつまづくのがタイトルにもある通り

「Timestamp型のカラムにinsertするための日付フォーマットはなに?」

というものである。

 

いや、そんなのつまづかないよ、当たり前だろ。

 

という方も多いと思いでしょうが、割と忘れてしまうことが(私は)多く、insertでエラーとなりはじかれることがある。

初心者としてはタイムタンプ型ってそもそも何よ?となるが、

それについては他にわかりやすい記事がたくさんあるので割愛する。

 

ちなみに表示されるエラーは

SQL0180N 日時値のストリング表記の構文が、間違っています。 SQLSTATE=22007

 

 

よくエラーになるのは、DB2SQLServerOracleもだっけ。。。

 

ダメな例:
insert into table(timestamp) values('2017/07/12 12:34:56);

正解の例:

insert into table(timestamp) values('2017-07-12 12:34:56);

 

社内にDB2OracleSQLServerが転がっていて面倒です。

 

なぜyyyy/mm/ddの形式で入力してしまうことが多いかというと、

最初に記載したDB接続ツールで表示されるTimestampのフォーマットがyyyy/mm/ddとなっているからである。

 

以上