タイガー!タイガー!じれったいぞー!(SE編)

AS400,WAS,GlassFish,Java,JavaEE,JSF等の開発における日々の気づきをまとめたブログ(備忘録)。

【AS400】 AS400のポート監視をZABBIXで行う

AS400+Zabbix連携ネタの続きです。

今度は、AS400が開いているポートを継続監視します。とりあえず、今回は、TELNETポート23を監視してみようと思います。

①アイテム追加

  • 設定→ホスト より、「AS400」ホストを選択し、アイテムのリンクより画面右上の「アイテムの作成」をクリック。

f:id:no14141:20170818125924j:plain

項目 設定値 備考
名前 Port監視(23_telnet) 当アイテムの名前
タイプ シンプルチェック
キー net.tcp.service[tcp,,23] TCP23ポートをチェック
ホストインターフェース 192.168.1.250:10050
ユーザー名  
パスワード  
データ型 数値(整数) 1:サービス起動 0:サービス停止
データの形式 10進数
単位
乗数
更新間隔(秒) 0 ここでは設定せず。次の更新間隔カスタマイズを優先
更新間隔カスタマイズ 定期設定 m/1 ※この設定で常に00秒時にデータを取得する

キー・ダイアログ

  • キー項目の右端の【選択】ボタンで、下記のようなダイアログが表示します。

f:id:no14141:20170818125930j:plain

②グラフ追加

  • グラフは、①で設定したアイテムの名前を選択します。

f:id:no14141:20170818125938j:plain

③トリガー追加

トリガー

  • トリガーは、1分ごとにキーを取得し、連続3回すべて0(サービス停止)の場合に、「障害」とするようにしました(1回でもいいような気も・・・)。
  • 障害時の通知処理は、メールやslack等で受け取れるようにします。

f:id:no14141:20170818125934j:plain

【条件式】
{AS400:net.tcp.service[tcp,,23].last(#3)}=0

依存関係

  • 依存関係の設定は、必要に応じ、AS400自身のICMPのping監視や上位のスイッチなどのICMPのping監視を設定します。依存関係は、依存設定したアイテムが有効である場合にのみ、今回対象のトリガーを生かします。
  • 今回は、すでにICMPテンプレートを適用していたので、そのテンプレートの中の1アイテム「AS400: {HOST.NAME} is unavailable by ICMP」を依存先として追加しました。AS400pingが飛ばない場合には、TCP23ポートの障害としては発砲されません。

f:id:no14141:20170818133318j:plain

※以上で、設定は完了です。

次回は、as400のNTPクライアントの話を書きたいと思います。

「テレビ東京ビジネスオンデマンド」が実にいい

去年の11月から契約している「テレビ東京ビジネスオンデマンド」。

これが実にいいのであります!
毎月、500円(税抜)でアーカイブも見放題ということで、かなりの安さ!

テレビ東京系が放送されていない地方の人間ではありますが、今の時代、様々な手段で動画に触れることができて、本当に便利です。

このオンデマンドを契約する動機は、とてもベタではありますが、「カンブリア宮殿」と「ガイアの夜明け」を毎週観るため。

これら番組を毎週観ていると、仕事に対する視野が広がってきたといいますか、頭が多少、柔らかくなってきたように思っています(自己評価)。

それにしても、震災以降、ほとんどTVを観なくなっています。こういうドキュメンタリーを観ているほうが、本当に面白い! 
目的もなくTVをダラダラ見て、自分の大切の時間を失うのはもったいない。なので、このオンデマンドは、PCで1.5倍速で視聴させてもらっています。

残念なのは、倍速の速度で2倍が無いこと、さらにスマホアプリでは倍速機能自体が無い点でしょうか。
こちらについては、いつか提供されることを期待して待ちたいと思っています。

ついうっかり視聴を忘れると、どんどん溜まっていってしまうので、ToDoリスト(私はTodoist有償版を使用)のリポート機能(毎週1回)を使って、無理なく継続視聴ができるようになってきました。

まだ10ヵ月程度のユーザーではありますが、引き続き、新しい情報収集、並びに新しい気づきを得るため、どんどん活用していこうと思っています。

【AS400】 SNMPを起動し、ZABBIXで監視を行う (2)

次にZABBIX側の設定になります。


(1) ホストの基本設定

  • 「設定」→「ホスト」より選択します。(AS400のホストが無い場合は、右上の「ホストの作成」ボタンで追加します)
  • AS400のホストへ「SNMPインターフェース」を記述します。
    • bulkリクエストを使用:一度のコネクションで複数のSNMPのデータをまとめて取得。とりあえず今回は、チェックをありにしました。

f:id:no14141:20170808124144j:plain

(2) CPU使用率の監視設定

①アイテム追加

f:id:no14141:20170808125449j:plain

項目 設定値 備考
名前 CPU使用率(100乗の値) 当アイテムの名前
タイプ SNMPv1エージェント
キー SNMPv2-SMIenterprises.2.6.4.5.1.0 トリガー式で参照する値
ホストインターフェース 192.168.1.250:161
SNMP OID SNMPv2-SMI::enterprises.2.6.4.5.1.0
SNMPコミュニティ ZABBIX
ポート
データ型 数値(整数)
データの形式 10進数
単位
乗数
更新間隔(秒) 0 ここでは設定せず。次の更新間隔カスタマイズを優先
更新間隔カスタマイズ 定期設定 m/1 ※この設定で常に00秒時にデータを取得する

②グラフ追加

  • グラフは、①で設定したアイテムの名前を選択すれば、完了!

f:id:no14141:20170808132704j:plain

③トリガー追加

  • トリガーは、1分ごとにCPU率を取得し、連続3回すべてが95%を超えたの場合に、「障害」とするようにしました。
  • ちなみに、SNMPで取得した値は、10000=100%なので、9500が95%となります。
  • 障害時の通知処理は、メールやslack等で受け取れるようにします。

f:id:no14141:20170808132713j:plain

④グラフ表示結果

  • これで、CPU使用率の状況を24時間365日監視できるようになりました!

f:id:no14141:20170809124303j:plain

(3) ディスク使用率の監視設定

  • 次にハードディスクの使用率を監視します。

①アイテム追加

  • アイテムは、「総容量」(常に一定)と「使用済容量」をSNMPで取得し、その2つの値を計算した「HDD使用率」の3つを準備しました。
ディスク総容量
  • 総容量は、増設をしない限り、一定ではあるのですが、不変であるかの確認を兼ねて、SNMPから取得するようにしました。
  • これは不要と思われる場合は、HDD使用率の計算で分母を固定値で計算しても良いかもしれません。

f:id:no14141:20170809123628j:plain

項目 設定値 備考
名前 ディスク総容量 当アイテムの名前
タイプ SNMPv1エージェント
キー HOST-RESOURCES-MIBhrStorageSize.1 トリガー式で参照する値
ホストインターフェース 192.168.1.250:161
SNMP OID HOST-RESOURCES-MIB::hrStorageSize.1
SNMPコミュニティ ZABBIX
ポート
データ型 数値(整数)
データの形式 10進数
単位
乗数
更新間隔(秒) 60
ディスク使用容量
  • こちらは、必ず取得する必要のある値です。現時点でのディスク使用容量になります。

f:id:no14141:20170809123638j:plain

項目 設定値 備考
名前 ディスク使用容量 当アイテムの名前
タイプ SNMPv1エージェント
キー HOST-RESOURCES-MIBhrStorageUsed.1 トリガー式で参照する値
ホストインターフェース 192.168.1.250:161
SNMP OID HOST-RESOURCES-MIB::hrStorageUsed.1
SNMPコミュニティ ZABBIX
ポート
データ型 数値(整数)
データの形式 10進数
単位
乗数
更新間隔(秒) 60
ディスク使用率(%)
  • 先に取得した2つの値を使って計算します。
  • 計算式
    • 使用容量÷総容量×100 (%)

f:id:no14141:20170809123645j:plain

項目 設定値 備考
名前 ディスク使用率(%) 当アイテムの名前
タイプ 計算
キー asdiskper トリガー式で参照する値
(last(HOST-RESOURCES-MIBhrStorageUsed.1)/last(HOST-RESOURCES-MIBhrStorageSize.1))*100
データ型 数値(浮動小数
単位 %
更新間隔(秒) 60

②グラフ追加

  • CPU使用率と同様に、作成済みアイテム(使用率)を選択します。

f:id:no14141:20170809123655j:plain

③トリガー追加

  • こちらは、現状の状況に合わせて、とりあえず70%を超えたら、アラート扱いにしました。

f:id:no14141:20170809123703j:plain

④グラフ表示結果

  • このような結果グラフになりました。早々変動するものでもないですね。

f:id:no14141:20170809124255j:plain


以上で、CPU使用率とHDD使用率の2つを監視できるようになりました。

また別の機会に、今度はZABBIXのポート監視についてまとめようと思っています。

【AS400】 SNMPを起動し、ZABBIXで監視を行う (1)

安定感抜群のAS400ではありますが、自動的に監視して、異常時にはアラートを発砲できるようにしたいと考えました。情報が少なく、かなり苦戦しましたが、とりあえず監視ができるようになりましたので、その手順を記しておこうと思います。


(1)AS400 SNMP設定

SNMP設定

> CHGSNMPA SYSD('IBM I 7.1 SNMP AGENT') AUTOSTART(*YES) 
    TRPMGR(('192.168.1.251' '255.255.255.0' 'ZABBIX' *YES))   
 
SNMP 属性が正常に変更されました。 

②コミュニティ名の追加

public(出荷時に登録済み)
  • publicは、出荷時設定であるので、このまま生かすことにしました。
コミュニティー名 public
ASCIICOM *YES
INTNETADR *ANY
OBJACC *READ
LOGSET *NO
LOGGET *NO
  • 削除する場合はRMVCOMSNMPコマンドでできるようです。(ただし、試していません)
    • RMVCOMSNMP COM(‘public’)
ZABBIX(追加)
  • COMパラメータは、カンマは不要でした。
> ADDCOMSNMP COM(ZABBIX) INTNETADR(('192.168.1.251' '255.255.255.0'))

 コミュニティーが追加された。

(2)AS400 SNMP起動/確認/停止

SNMPクライアント起動

> STRTCPSVR SERVER(*SNMP)        

SNMP サーバーは開始中である。

②起動後の確認

WRKACTJOB SBS(QSYSWRK)
  • QSNMPSA、QTMSNMP、QTMSNMPRCVの3つのJOBが起動しました。
                               活動ジョブの処理  
           
OPT  サブシステム/ジョブ  ユーザー       タイプ  CPU %   機能            状況
     QSYSWRK        QSYS        SBS      .0                   DEQW
       :
       QSNMPSA      QTCP        BCH      .0  PGM-QNMSARTR     DEQW  <<<(起動) 
       :
       QTMSNMP      QTCP        BCH      .0  PGM-QTOSMAIN     DEQW  <<<(起動) 
       QTMSNMPRCV   QTCP        BCH      .0  PGM-QTOSRCVR     TIMW  <<<(起動) 
DSPMSG QSYSOPR
  • 新しいメッセージが追記されました。
                    応答が必要でないメッセージ 
SNMP coldStart トラップが生成された。   <<<<<<<(追記)
WRKTCPSTS (NETSTAT) - 3.IPV4 接続状況の処理
  • F14キーで、ポート名の表示が可能です。
  • 新しく、SNMPの標準の 161/UDP がOPENされたのを確認できました!
                              IPV4 接続状況の処理
                                                                                   
                        リモート   ローカル      アイドル   
 OPT  リモート・アドレス       ・ポート  ・ポート      時間    状態    
      *                    *     21  009:03:35   接続待機
      *                    *     23  000:11:03   接続待機
      *                    *     25  450:18:30   接続待機
      *                    *     80  000:19:28   接続待機
      *                    *    123  018:18:30  *UDP      
      *                    *    137  450:18:35   接続待機 
      *                    *    137  000:00:50  *UDP    
      *                    *    138  000:00:20  *UDP  
      *                    *    139  450:18:30   接続待機
      *                    *    161  000:04:38  *UDP     <<<<<(OPEN)
      *                    *    427  450:18:33  *UDP 
                                                                続く ...

SNMPクライアント停止

  • 起動に成功できたので、いったん、コマンドで停止を実施します。こちらも問題なく、停止できました。
> ENDTCPSVR SERVER(*SNMP)  

SNMP サーバーが終了した。
DSPMSG QSYSOPR
                    応答が必要でないメッセージ     
 ジョブ xxxxxx/QTCP/QSNMPSA がユーザー QTCP によって終了された。
 ジョブ xxxxxx/QTCP/QTMSNMPRCV がユーザー QTCP によって終了された。
  • 161ポート待ちが無くなりました。
  • JOB QSNMPSA, QTMSNMP, QTMSNMPRCV が無くなりました。

SNMPクライアント起動(再)

  • 停止後は、正式に起動開始です!
> STRTCPSVR SERVER(*SNMP)  

SNMP サーバーは開始中である。 

(3)SNMPマネージャーからの動作検証

  • AS400上で、SNMPが起動できたので、今後はZABBIXサーバやWindowsPCから、SNMP情報をゲットするための snmpwalkコマンドを試します。
  • 事前に、LinuxWindowsに「net-snmp」をインストールしてあります(ここでの説明は省略)。

Zabbixから操作

  • ZABBIXサーバにSSH接続しての検証結果です。
成功
  • コミュニティ名は、public と ZABBIXでそれぞれ成功しました!
$ snmpwalk -v 1 -c public 192.168.1.250

$ snmpwalk -v 1 -c ZABBIX 192.168.1.250

$ snmpwalk -v 1 -c ZABBIX -t 10 192.168.1.250
失敗
  • ただし、version2 とコミュニティ名=zabbix(小文字)では、失敗しました。
$ snmpwalk -v 2c -c public 192.168.1.250
Timeout: No Response from 192.168.1.250     (ver2 では応答なし)

$ snmpwalk -v 1 -c zabbix 192.168.1.250
Timeout: No Response from 192.168.1.250     (zabbixでは応答なし)

WindowsPCから操作

  • 今度は、WindowsPCからの検証結果です。
  • コミュニティ名は、public のみ成功! 当然ながら IPアドレスが不一致なので、ZABBIX では失敗です。
成功
> snmpwalk -v 1 -c public 192.168.1.250
失敗
> snmpwalk -v 1 -c ZABBIX 192.168.1.250
Created directory: C:/apps/net-snmp/snmp/persist/mib_indexes
Timeout: No Response from 192.168.1.250

OID

  • SNMPでは、MIB(ミブ)と呼ばれるフォーマットで、ツリー構造になっています。
  • MIBにある情報の1つ1つをオブジェクトと呼ばれ、どのオブジェクトもOID (オブジェクトID)で表現されているようです。

1.3.6.1.2.1.1 (SNMP MIB-2 System)

  • まずは、基本的なsystemサブツリーを取得してみました。
  • OS名やシステムが起動中のトータル時間などを確認できました!
> snmpwalk -v 1 -c public 192.168.1.250 1.3.6.1.2.1.1
SNMPv2-MIB::sysDescr.0 = STRING: IBM OS/400 V7R1M0
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.2.6.11
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (1736729) 4:49:27.29
SNMPv2-MIB::sysContact.0 = STRING:
SNMPv2-MIB::sysName.0 = STRING: xxxxxxxxxxxxxx
:

1.3.6.1.2.1.25.2.3.1 (hrStorageEntry)

> snmpwalk -v 1 -c public 192.168.1.250 1.3.6.1.2.1.25.2.3.1
:
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 136323072  <<<<<<<<<<<<<<<<<<<
HOST-RESOURCES-MIB::hrStorageSize.2 = INTEGER: 397311
HOST-RESOURCES-MIB::hrStorageSize.3 = INTEGER: 6215637
HOST-RESOURCES-MIB::hrStorageSize.4 = INTEGER: 1367371
HOST-RESOURCES-MIB::hrStorageSize.5 = INTEGER: 80609
HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 80001828   <<<<<<<<<<<<<<<<<<<
HOST-RESOURCES-MIB::hrStorageUsed.2 = INTEGER: 338366
HOST-RESOURCES-MIB::hrStorageUsed.3 = INTEGER: 4352806
HOST-RESOURCES-MIB::hrStorageUsed.4 = INTEGER: 865096
HOST-RESOURCES-MIB::hrStorageUsed.5 = INTEGER: 72730

1.3.6.1.4.1.2.6.4.5.1.0 (IBMCPU-MIB (v1))

  • 最後にCPU使用率の取得です。
  • IBM独自のOIDで確認可能なようです。

AS/400 CPU = “1.3.6.1.4.1.2.6.4.5.1.0” (10000=100%)

> snmpwalk -v 1 -c public 192.168.1.250 1.3.6.1.4.1.2.6.4.5.1.0
SNMPv2-SMI::enterprises.2.6.4.5.1.0 = Gauge32: 60   <<<<<<<<< 0.60% 

これで、準備は整いました。

次回は、ZABBIX側での設定をまとめようと思います。

【NetBeans】文字コードの設定

PC移行に伴い、NetBeansを新たにセットアップしたのですが、文字化けに苦しんだので、現時点で上手くいった設定を記録しておこうと思います。

私の環境(2017-06-29)

  • OS: Windows10 Pro x64 anniversary update
  • Java: 1.8.0_112
  • NetBeans: 8.2
  • Maven: 3.0.5(バンドル版)
  • JavaServer : Payara 4.1.1.163

設定手順

Serverのコンソールログ、並びにMavenの実行結果の両方を「UTF-8」で出力させる設定になります。

(1) PC環境変数設定

  • 結論から言いますと、結局、この設定だけで文字化け問題は解決しました。
  • ユーザー環境変数に「JAVA_TOOL_OPTIONS」を追加します。
変数名: JAVA_TOOL_OPTIONS
変数値: -Dfile.encoding=UTF-8

f:id:no14141:20170629180328j:plain

(2) NetBeans設定

  • NetBeansでは、起動オプションを設定ファイルでの編集が可能です(私の保存場所:C:\Program Files\NetBeans 8.2\etc\netbeans.conf)。
  • 以前は、「netbeans_default_options」に「-J-Dfile.encoding=UTF-8」を追記していたはずでしたが、改めて前のPCの設定を確認してみると、設定は存在しませんでした。ちなみに「-J-Dfile.encoding=UTF-8」を追記すると、Mavenの出力が文字化けしました。
  • 結局こちらには、jdkhomeの設定のみとしました。
netbeans_jdkhome="C:\Program Files\Java\jdk1.8.0_112"

以上でPayaraへのログ、並びにIDE上で実行するMavenの出力は、すべて文字化けしないようになりました。

「JJUG CCC 2017 Spring」に行ってきました #jjug_ccc

2017年5月20日にJJUGに行ってきました。 トータルこれで4回目。2016年春からは3回連続で参加させていただいております。

今回はJava基本的なコーディング力とDB関連の技術情報を得ることが目的。
毎回、JJUGのあとは、何か新しいことを取り入れているので、今回もぜひとも実現したいところ。

www.java-users.jp

日本Javaユーザーグループ 年次総会

それにしてもすごい人。20代の若者たちが多く参加しているようで。40代の私ですが、好奇心は若者たちと同じくらいあると思いたい!
毎回思うのですが、コミュニティ運営者の方々には、感謝しかありません。
B/S、P/Lを拝見するのも、春のお楽しみのひとつ。

来年は何と10周年イベントを開催予定だとか!! これは楽しみが1つ増えましたね!

ふつうのJavaコーディング

発表者のirofさんからは、「みなさん、部屋、間違えてません?」と一言。立ち見の方が多く出るほど大盛況でした。
今回の1つの目的、Java基礎力アップ。そのヒントをたくさんいただけたセッションでした。
「コードは読み物」「引数を少なくする」「名前で表現する」などなど。なかでも名言だったのが「わざわざ作ると向き合う」という言葉。動けばいい、動いたからオッケー!という日もこれまで何度もありました。意識を変えて、今後はこのセッションで学んだことを取り入れて、自分のコードを少しでも美しくしていきたいと思いました。
まず、すぐにでも実践しようと思ったことは、enumにメソッドを持たせること。これまでは、ただの値を列挙していただけだったので、これならすぐにでもトライできそうです。

Vue.js + Spring Bootで楽しくフルスタック開発やってみた

今後の開発をJSFからJS系に切り替えていこうと考えている最中なのですが、いったい、どのJSフレームワークがいいのか? 毎日のように悩んでおりましたが、まずは実際にやっている人の声を聞きたいということで、こちらのセッションを選択しました。
Vue.jsのお話が聞けました。AngularとReactの2強と思っていたのですが、このフレームワークも評判がいいようです。学習コストがあまりかからないという話も。
Vueの話だけではなく、Selenide、CSS Grid Layoutもおすすめとか。どちらも触ったことがないため、イメージがわかず。自分の手をトコトン動かすしかありませんね。
Javaデザインパターンでは、「Observer」「Iterator」「Visitor」あたりはとても重要とのことで、あたらめて復習する必要がありそうです!

SpotBugs(FindBugs)による大規模ERPのコード品質改善

当初は、Postgresのセッションに出る予定でしたが、直前にこちらに変更! 「ふつうのJavaコーディング」を聞いて、より品質改善に意識が向いたからこそです。
FindBugsって、開発が止まっていたのですね。性的解析ツールの基本をこちらでは、教わりました。
SonarQubeを試したいというテーマも1年以上放置しているので、こちらについてもJenkinsで実行できるように挑戦しようと思っています。

Javaエンジニアに知って欲しいRDBアンチパターン

個人的には、こちらのセッションで最後(この後、マインドフルネスの体験の予定を入れていたため)。
最後にふさわしい熱気のある素晴らしいセッションでした。DBのアンチパターンの話、少しずつリファクタリングしていくという話、いずれも目から鱗でした。ちょうど、購読中の雑誌「ソフトウェアデザイン」に壮大さんの記事が連載中なので、合わせてきちんとチェックしたいところです(すでに始まっているのに、まだ読めていません。。。) 印象に残った言葉も多くいただきました。「データベースの死はサービスの死」「データベース問題を解決できる人は英雄」「DBの問題は忘れた頃にやってくる」「RDBの知識は寿命が長い。覚えれば仕事で長い間役に立つ」、特にコップからあふれた水の話がわかりやすかった!
これを聞いて、今使っているRDBの監視を強化しよう!と強く思った次第です。


今回はJavaEE関連のセッションには、参加しませんでした。
いよいよ、今年夏以降には、新しいSEとEEが登場してきます。検証はする予定ですが、まずは現在開発中のアプリを安定して動かすことが当面の目標なので、今回学んだことを今の開発に持ち込んで、今よりもちょっとでも良くしていけたらいいなと思っています。
そのためにも、はてなの大西さんの言葉「手を動かした人だけが世界を変える」を教訓とし、手を動かし続けていく必要がありそうです!!

【AS400】RPGLE-MOVEA命令をfreeでどう書くか

最近、RPGLEはほぼFree形式で書くようにしています。

しかしながら、MOVEA命令のfree置き換えが無いっぽいので、困っておりました。

MOVEA命令は、標識の一括セット/クリアなどで便利だったのですが・・・。

サンプル1

標識30~59までを一括でOFFに設定する例です。

C                   MOVEL     *ALL'0'       W@FLGS           30 
C                   MOVEA     W@FLGS        *IN(30) 

そこで、仕方なくFOR文回し(サンプル2)でクリア処理を行っていましたが、BIF関数の%SUBARRを使えば、1行で書けることがわかったので、備忘録(サンプル3)として残します。

サンプル2

 /FREE 
  FOR INT=30 TO 59;            
      *IN(I) = *OFF;         
  ENDFOR;
 /END-FREE  

サンプル3

 /FREE
  %SUBARR(*IN:30:30) = *OFF;   //標識30番目から30個分(*IN30~59)
 /END-FREE  

残る課題は、サブファイル操作なので行う異なる値セットを一括でどうやるかです。
%SUBARRでは、'100'とか'011'をセットすることができません。
現状、標識セット命令を3行書いております。。。(汗)