Thứ Hai, 15 tháng 11, 2021

Convert Excel sang CSV với xlsx2csv (có hỗ trợ UTF8)

Mình bị dí cho import vài triệu row excel tiếng Việt vào database Oracle để xử lý (Oracle Developer hỗ trợ chưa tốt phần excel với file row + column lớn). Có nhiều cách để import, dạo quanh 1 hồi chị Google đc 1 bài viết khá hay. Đã test thử, toàn bộ định dạng UTF-8 đều được bảo toàn. Bước tiếp theo import CSV vào Oracle thì dễ rồi, trong linux thì csv càng thiên biến vạn hóa hơn.

python3 -m venv venv

source venv/bin/activate

pip3 install xlsx2csv

xlsx2csv -h

xlsx2csv -d '|' file_gốc.xlsx tên_file_được_chuyển.csv


Nguồn: https://github.com/dilshod/xlsx2csv

Nguồn: https://enesi.no/2019/01/import-large-excel-files-with-sql-developer/

Thứ Bảy, 25 tháng 4, 2020

Hướng dẫn cài đặt Nginx + LuaJIT bắt Header/Body của Request-Response

Hướng dẫn cài đặt Nginx + LuaJIT bắt Header #tuanduong122
Bài toán đặt ra của mình: Nhiều lúc mình ko biết thằng vẹo Internet nào nó chèn header bậy vào hệ thống. Hoặc gặp mấy cái API đắng được bàn giao - ông đối tác bảo em cũng mới nhận code, mà ko biết nó hoạt động như nào. Mình sẽ chèn nginx (đứng trước/đứng sau) để bắt xem Header, Body chúng nó hoạt động ra sao. Từ đó ông Sys sẽ hiểu hệ thống hoạt động hơn (khổ).
Mình xin đưa nguồn tham khảo trước, mình dựa vào các hướng dẫn để tối ưu vào cài đặt của mình.
1. https://cuongquach.com/cau-hinh-nginx-ghi-log-thong-tin-header-http.html #Cường Quách , có rất nhiều bài viết hay
2. Tham khảo cấu hình: https://www.hardill.me.uk/wordpress/2018/03/14/logging-requests-and-response-with-nginx/
3. Tham khảo cài đặt: https://linuxscriptshub.com/nginx-httpguard-to-block-cc-attack-centos-6-9/  #trang web nhiều cái hay :D
4. Tham khảo cài đặt: https://tarunlalwani.com/post/building-nginx-with-lua/
Version mình sử dụng:
- Nginx-1.17.10 (Bản stable mới nhất tính đến 04.2020)
- LuaJIT-2.0.5
- lua-nginx-module-0.10.13
- ngx_devel_kit-0.3.1rc1
- Áp dụng cho cả Centos6/7. Ở đây mình đang test trên bản 7 (CentOS 6 mình cũng cài đặt thành công)

Bước 1: Cài đặt thư viện cơ bản hỗ trợ nginx:

yum install wget readline-devel pcre pcre-devel openssl openssl-devel zlib zlib-devel gcc 

Bước 2: Cài đặt / Chuẩn bị LuaJIT

- Tải LuaJIT về và giải nén
cd /opt
wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar zxf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5

- Chèn export ở trên đầu, lưu file lại
vim Makefile
export PREFIX= /opt/luajit-2.0.5

- Thực hiện Compile LuaJIT
make 
make install
Set biến môi trường tạm thời
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0

Bước 3: Cài đặt nginx và các thư viện:

cd /opt
wget http://nginx.org/download/nginx-1.17.10.tar.gz
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1rc1.tar.gz
tar -xvzf nginx-1.17.10.tar.gz 
tar -xvzf v0.10.13.tar.gz 
tar -xvzf v0.3.1rc1.tar.gz 

cd nginx-1.17.10
mkdir -p /opt/nginx
mkdir /opt/nginx/logs/
mkdir /run

- Thực hiện Compile Nginx, ở đây mình đặt Nginx ở thư mục OPT ưa thích (không phải /etc)

./configure  --sbin-path=/usr/bin/nginx --prefix=/opt/nginx --conf-path=/opt/nginx/nginx.conf --error-log-path=/opt/nginx/logs/error.log --http-log-path=/opt/nginx/logs/access.log --with-pcre --pid-path=/var/run/nginx.pid --with-http_ssl_module --with-http_realip_module --with-http_stub_status_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module  --with-ld-opt="-Wl,-rpath,/usr/local/lib" --add-module=/opt/lua-nginx-module-0.10.13 --add-module=/opt/ngx_devel_kit-0.3.1rc1
make
make install
Tạo file khởi động cho nginx (init file)
touch /etc/init.d/nginx
chmod 755 /etc/init.d/nginx
vim /etc/init.d/nginx
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15 
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid
 
# Source function library.
. /etc/rc.d/init.d/functions
 
# Source networking configuration.
. /etc/sysconfig/network
 
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
 
nginx="/usr/bin/nginx"
prog=$(basename $nginx)
 
NGINX_CONF_FILE="/opt/nginx/nginx.conf"
 
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
 
lockfile=/var/lock/subsys/nginx
 
make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   if [ -z "`grep $user /etc/passwd`" ]; then
       useradd -M -s /bin/nologin $user
   fi
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}
 
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
#    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
 
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
 
restart() {
    configtest || return $?
    stop
    sleep 1
    start
}
 
reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}
 
force_reload() {
    restart
}
 
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
 
rh_status() {
    status $prog
}
 
rh_status_q() {
    rh_status >/dev/null 2>&1
}
 
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac
Test nginx syntax
[root@localhost setup]# nginx -t
nginx: the configuration file /opt/nginx/nginx.conf syntax is ok
nginx: configuration file /opt/nginx/nginx.conf test is successful
#>>>>>>> NGON, Tạm ổn
Add nginx vào systemctl và restart
/etc/init.d/nginx status
Sẽ lỗi: Unit nginx.service could not be found.
--
systemctl daemon-reload
/etc/init.d/nginx restart
Dọn rác khi cài:
mkdir /opt/setup
cd /opt
mv LuaJIT-2.0.5                 /opt/setup/
mv LuaJIT-2.0.5.tar.gz          /opt/setup/
mv lua-nginx-module-0.10.13     /opt/setup/
mv nginx-1.17.10                /opt/setup/
mv nginx-1.17.10.tar.gz         /opt/setup/
mv ngx_devel_kit-0.3.1rc1       /opt/setup/
mv v0.10.13.tar.gz              /opt/setup/
mv v0.3.1rc1.tar.gz             /opt/setup/

Bước4 : Cấu hình test LUA

(Có thể bỏ qua bước này và đi luôn vào BƯỚC 5 - ở đây mình muốn test lua hoạt động oke chưa)
Thêm location này vào nginx (có thể bỏ qua bước này và copy nguyên file config của mình ở bước dưới - BƯỚC 5):
vim /opt/nginx/nginx.conf
 location /sum {
   content_by_lua_block {
     local args = ngx.req.get_uri_args();
     ngx.say(args.a + args.b)
   }
 }
Test syntax nginx và reload lại
[root@localhost opt]# nginx -t
nginx: the configuration file /opt/nginx/nginx.conf syntax is ok
nginx: configuration file /opt/nginx/nginx.conf test is successful

[root@localhost opt]# /etc/init.d/nginx reload
Reloading nginx configuration (via systemctl):             [  OK  ]
TEST LUA:
curl "http://localhost/sum/?a=10&b=20"
Kết quả ra : 30, vậy là Lua đã hoạt động - OK :heart_eyes:

Bước 5 : Cấu hình log Header

Cấu hình full nginx.conf
#user  nobody;
worker_processes  auto;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

log_format log_req_resp '$remote_addr - $remote_user [$time_local] '
' "$request" $status $body_bytes_sent ${request_time}ms '
'| PRINT_REQUEST_BODY: $request_body '
'| PRINT_REQUEST_HEADER:"$req_header" '
'| PRINT_RESPONSE_HEADER:"$resp_header" '
'| PRINT_RESPONSE_BODY:"$resp_body" ';
                      
    access_log  logs/access.log log_req_resp;

    sendfile        on;
    keepalive_timeout  65;

#Cấu hình web_server listen Port_80
    server {
        listen       80;
        server_name  _;
 
 #Step1: Test Lua Sum
 location /sum {
    content_by_lua_block {
      local args = ngx.req.get_uri_args();
      ngx.say(args.a + args.b)
   }
 }



    location / {
        #Step2: Config REPSONSE_BODY
        lua_need_request_body on;
      
        set $resp_body "";
        body_filter_by_lua '
          local resp_body = string.sub(ngx.arg[1], 1, 1000)
          ngx.ctx.buffered = (ngx.ctx.buffered or "") .. resp_body
          if ngx.arg[2] then
             ngx.var.resp_body = ngx.ctx.buffered
          end
        ';
      
        #Step3: Config REQUEST_HEADER, RESPONSE_HEADER
        set $req_header "";
        set $resp_header "";
        header_filter_by_lua ' 
          local h = ngx.req.get_headers()
          for k, v in pairs(h) do
              ngx.var.req_header = ngx.var.req_header .. k.."="..v.." "
          end
          local rh = ngx.resp.get_headers()
          for k, v in pairs(rh) do
              ngx.var.resp_header = ngx.var.resp_header .. k.."="..v.." "
          end
        ';  
        
         proxy_pass http://localhost:8080/;   # ở đây tôi proxy vào 1 con tomcat8 test     
        }



        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

Kiểm tra test lại nginx #nginx_syntax
[root@localhost nginx]# nginx -t
nginx: the configuration file /opt/nginx/nginx.conf syntax is ok
nginx: configuration file /opt/nginx/nginx.conf test is successful 

[root@localhost opt]# /etc/init.d/nginx reload
Reloading nginx configuration (via systemctl):             [  OK  ]
Bước: Test POST chả hạn
[root@localhost ROOT]# curl -X POST  -H "Host:tuanduong122.wordpress.com" -H "Tuanda:hehehe" -d '{"DUONGANHTUAN_BODY":"123"}' localhost
Kết quả: APACHE TOMCAT8 BODY
vào đọc log accesss:
tail /opt/nginx/logs/access.log
127.0.0.1 - - [24/Apr/2020:19:04:26 -0400]  "POST / HTTP/1.1" 200 20 0.346ms | PRINT_REQUEST_BODY: {\x22DUONGANHTUAN_BODY\x22:\x22123\x22} | PRINT_REQUEST_HEADER:"host=tuanduong122.wordpress.com content-type=application/x-www-form-urlencoded tuanda=hehehe accept=*/* content-length=27 user-agent=curl/7.29.0 " | PRINT_RESPONSE_HEADER:"content-length=20 set-cookie=JSESSIONID=C94254D1F47723462F60222FE865D9FB; Path=/; HttpOnly content-type=text/html;charset=ISO-8859-1 connection=keep-alive " | PRINT_RESPONSE_BODY:"APACHE TOMCAT8 BODY\x0A"
Phân tích Kết quả:
PRINT_REQUEST_BODY: {\x22DUONGANHTUAN_BODY\x22:\x22123\x22}
PRINT_REQUEST_HEADER:"host=tuanduong122.wordpress.com content-type=application/x-www-form-urlencoded tuanda=hehehe accept=/ content-length=27 user-agent=curl/7.29.0 "
PRINT_RESPONSE_HEADER:"content-length=20 set-cookie=JSESSIONID=C94254D1F47723462F60222FE865D9FB; Path=/; HttpOnly content-type=text/html;charset=ISO-8859-1 connection=keep-alive "
PRINT_RESPONSE_BODY:"APACHE TOMCAT8 BODY\x0A"

Bonus_1: Lua Show Request Body as Response

     location = /request_body {
         client_max_body_size 50k;
         client_body_buffer_size 50k;

         content_by_lua_block {
             ngx.req.read_body()  -- explicitly read the req body
             local data = ngx.req.get_body_data()
             if data then
                 ngx.say("body data:")
                 ngx.print(data)
                 return
             end

             -- body may get buffered in a temp file:
             local file = ngx.req.get_body_file()
             if file then
                 ngx.say("body is in file ", file)
             else
                 ngx.say("no body found")
             end
         }
     }
[root@tuanda conf]# curl -X GET -d '{test:123}' localhost/request_body
body data:
{test:123}

Thứ Hai, 11 tháng 11, 2019

[Other] 4 giây - 2 phút - 72 giờ và 21 ngày: Công thức kì diệu giúp bạn đạt mọi mục tiêu và không bao giờ bị trì hoãn

Trước khi bắt đầu đọc bài viết này, bạn hãy dành một chút thời gian để suy nghĩ xem: Đã bao nhiêu lần bạn lập ra danh sách các mục tiêu mà mình muốn thực hiện? Chắc chắn, số lần đó luôn nhiều hơn những hành động thực tế bạn làm để đạt được mục tiêu.
Luật 4 giây
Lời khuyên: Hãy hít thở thật sâu và chậm 4 giây trước khi bạn hành động hoặc đưa ra bất cứ quyết định quan trọng nào.
Trong cuộc sống , chúng ta thường có xu hướng trì hoãn việc đưa ra những quyết định quan trọng. Điều này có vẻ như một gánh nặng quá lớn, do vậy chúng ta muốn chờ thêm thời gian. Cho đến khi bắt buộc phải đưa ra quyết định, chúng ta sẽ quyết định nhất thời và thông thường sau đó sẽ là sự hối tiếc.
Nguyên tắc 4 giây sẽ giúp bạn đưa ra những quyết định tốt hơn. Peter Bregman, tác giả của cuốn sách “Luật 4 giây” cho rằng bạn nên hít thở thật đều và sâu trong vòng 4 giây; sau đó bạn có thể hành động.
Tại sao việc này quan trọng? Đó chính là nghệ thuật tự kiểm soát. Hít thở sâu sẽ tránh cho bạn khỏi việc đưa ra các quyết định vội vã và mang lại cho bạn thời gian để đánh giá kết quả của mỗi hành động.
Luật 2 phút

Lời khuyên: Nếu việc nào đó chỉ tốn chưa đến 2 phút để hoàn thành, bạn hãy thực hiện nó ngay lập tức.
Rất nhiều nhiệm vụ chúng ta trì hoãn thường không khó để hoàn thành. Chúng ta thường tránh làm chúng cho đến hạn chót, mặc dù nó không đòi hỏi kỹ năng hay kiến thức đặc biệt. Chẳng hạn, bạn cần phải gọi điện cho đối tắc hoặc gửi một email. Việc này chỉ mất 1 đến 2 phút nhưng bạn lại trì hoãn cho đến phút cuối cùng. Nhiệm vụ đơn giản này làm bạn bị chùn bước và mất tập trung.
Nguyên tắc 2 phút này sẽ giúp bạn đạt được những mục tiêu lớn. Mỗi mục tiêu đi kèm với một danh sách các hành động nhỏ. Chẳng hạn, bạn phải đọc 1 cuốn sách khoảng 2.000 trang, việc này sẽ khiến bạn mất vài tháng. Nếu như bạn tiếp tục nhìn cuốn sách như một tổng thể, bạn sẽ thấy nó khó mà hoàn thành, do đó bạn dễ bỏ cuộc. Nhưng nếu như bạn chia nhỏ cuốn sách thành từng trang và đặt mục tiêu đọc từng trang một, bạn sẽ mất chưa đến 2 phút cho một trang sách.
Luật 72 giờ

Lời khuyên: Khi bạn đã có 1 ý tưởng, hãy thực hiện nó trong vòng 3 ngày (72 giờ).
Bodo Schaefer – tác giả sách, doanh nhân kiêm diễn giả nổi tiếng người Đức cho rằng nguyên tắc đơn giản này sẽ giúp bạn đẩy lùi trì hoãn: Đừng bao giờ đặt ra các nhiệm vụ kéo dài quá 72 giờ. Nếu bạn trì hoãn hành động này, ý tưởng của bạn sẽ mãi nằm trên giấy mà thôi.
Luật 21 ngày

Lời khuyên: Hãy cho bản thân 21 ngày để phát triển một thói quen
Khi bạn muốn đạt được một mục tiêu nào đó, bạn phải biến các hành động thành thói quen hàng ngày. Hãy lập lại danh sách mục tiêu một lần nữa, tập trung vào các mục tiêu đơn lẻ và biến nó thành hành động, sau đó thực hiện đều đặn mỗi ngày. Đó có thể là viết blog, ngồi thiền, chạy bộ hay học tiếng Anh… bất cứ việc gì.
Trong những ngày đầu tiên, bạn sẽ cần rất nhiều nỗ lực. Nhưng một khi đã quen dần với nó, bạn sẽ cảm thấy điều này như một phần cuộc sống.
Nguyên tắc 10.000 giờ

Lời khuyên: Khi bạn cố gắng để thành thạo trong lĩnh vực nào đó, bạn cần dành khoảng 10.000 giờ thực hành việc đó.
Trong cuốn sách “Outliers: The Story of Succes” (Tạm dịch: Những kẻ xuất chúng), tác giả người Canada Malcolm Gladwell đã đề cập đến nguyên tắc 10.000 giờ thực hành đóng góp vào thành công của hầu hết các doanh nhân, triệu phú trên thế giới.
Để thực hiện quy tắc này, bạn hãy lựa chọn lĩnh vực mà mình yêu thích và lập kế hoạch để thực hành mỗi ngày. Hãy theo dõi thời gian mà bạn thực hành việc đó để đảm bảo bạn thực hiện đủ 10.000 giờ.

Thứ Sáu, 11 tháng 1, 2019

Zabbix Check Java JMX






ZABBIX MONITORING JAVA JMX

    


Contents
Sơ đồ hoạt động của Zabbix JMX.. 2
Phần 1: Cài đặt Tomcat + Enable JMX.. 2
Phần 2: Cài đặt và setting Zabbix-Server. 4
Phần 3: Bảo mật JMX.. 6
Phần 4: Fix lỗi template Tomcat7/8 của zabbix not-support. 8



tuanduong122


Sơ đồ hoạt động của Zabbix JMX



Ở bài hướng dẫn này chúng ta sẽ sử dụng ở phía client là : tomcat web-server và enable jmx lên (với các tiến trình chạy trên nền java khác cũng tương tự).
[Zabbix-server --- Zabbix Java gateway --- Tomcat JMX]

Phần 1: Cài đặt Tomcat + Enable JMX

Cài đặt java
# tar -xvzf jdk-8u181-linux-x64.tar.gz
# chown -R root.root jdk1.8.0_181
# mv jdk1.8.0_181 /opt/

Setting môi trường java
# alternatives --install /usr/bin/java java /opt/jdk1.8.0_181/bin/java 2
# alternatives --config java
# alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_181/bin/jar 2
# alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_181/bin/javac 2
# alternatives --install /usr/bin/javaws javaws /opt/jdk1.8.0_181/bin/javaws  2
# alternatives --set jar /opt/jdk1.8.0_181/bin/jar
# alternatives --set javac /opt/jdk1.8.0_181/bin/javac
# alternatives --set javaws /opt/jdk1.8.0_181/bin/javaws
# java –version

Cài đặt Tomcat
Tải tomcat tại đường dẫn https://tomcat.apache.org/download-80.cgi
# tar -xvzf apache-tomcat-8.5.37.tar.gz
# mv apache-tomcat-8.5.37 /opt/tomcat

Setting tomcat bật JMX
# vim /opt/tomcat/bin/setenv.sh
#Set Heap Memory Commnit and Max
export CATALINA_OPTS="$CATALINA_OPTS -Xms1024m"
export CATALINA_OPTS="$CATALINA_OPTS -Xmx3096m"

#Enable JMX with no authenticaion
export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote \
 -Dcom.sun.management.jmxremote.port=12345 \
 -Dcom.sun.management.jmxremote.authenticate=false \
 -Dcom.sun.management.jmxremote.ssl=false \
 -Djava.rmi.server.hostname=192.168.80.134"
IP 192.168.80.134 chính là ip của client.
Start tomcat
# cd /opt/tomcat/bin
# ./startup.sh
# tail -n 1000 /opt/tomcat/logs/*
# netstat -apln | grep 12345
tcp        0      0 :::12345                    :::*                        LISTEN      1553/java

Ta có thể tải jconsole.jar về để check real-time (Yêu cầu cài đặt java jdk để mở trên window https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html )






  



Phần 2: Cài đặt và setting Zabbix-Server


Cài đặt thêm zabbix-gateway-java trên zabbix-server
# yum install zabbix-java-gateway

Thêm config
[root@zabbix-server opt]# vim /etc/zabbix/zabbix_server.conf
JavaGateway=127.0.0.1
JavaGatewayPort=10052
StartJavaPollers=5

[root@ zabbix-server opt]# vim /etc/zabbix/zabbix_java_gateway.conf
LISTEN_PORT=10052
START_POLLERS=5

Restart zabbix-server và zabbix-gateway java
# /etc/init.d/zabbix-server restart
# /etc/init.d/zabbix-java-gateway restart

# ps aux | grep java
zabbix     2212  0.0  0.2 168920  3388 ?        S    21:03   0:00 /usr/sbin/zabbix_server: java poller #1 [got 0 values in 0.000057 sec, idle 5 sec]
zabbix     2213  0.0  0.2 168920  3388 ?        S    21:03   0:00 /usr/sbin/zabbix_server: java poller #2 [got 0 values in 0.000043 sec, idle 5 sec]
zabbix     2214  0.0  0.2 168920  3388 ?        S    21:03   0:00 /usr/sbin/zabbix_server: java poller #3 [got 0 values in 0.000059 sec, idle 5 sec]
zabbix     2215  0.0  0.2 168920  3388 ?        S    21:03   0:00 /usr/sbin/zabbix_server: java poller #4 [got 0 values in 0.000034 sec, idle 5 sec]
zabbix     2216  0.0  0.2 168920  3388 ?        S    21:03   0:00 /usr/sbin/zabbix_server: java poller #5 [got 0 values in 0.000049 sec, idle 5 sec]
zabbix     2275  2.4  2.1 2353872 30608 ?       Sl   21:04   0:00 java -server -classpath lib:lib/android-json-4.3_r3.1.jar:lib/logback-classic-0.9.27.jar:lib/logback-core-0.9.27.jar:lib/slf4j-api-1.6.1.jar:bin/zabbix-java-gateway-3.4.15.jar -Dzabbix.pidFile=/var/run/zabbix/zabbix_java.pid -Dzabbix.listenPort=10052 -Dzabbix.startPollers=5 com.zabbix.gateway.JavaGateway
root       2287  0.0  0.0 103324   896 pts/0    S+   21:04   0:00 grep java


Phần 1 ta đã cài agent, tiếp theo ta sẽ add client vào giám sát trong zabbix
Add hoặc sửa Host




Thêm Template:










Phần 3: Bảo mật JMX

Mục đích là để bảo mật JMX. Khi kết nối cần phải nhập pass và user. https://db.apache.org/derby/docs/10.10/adminguide/radminjmxenabledisable.html
Stop tomcat. Change lại setenv.sh
# /opt/tomcat/bin/shutdown.sh
# vim /opt/tomcat/bin/setenv.sh
#Enable JMX with authentication. You need create file "jmxremote.access" and "jmxremote.password" and chown readonly permission.
export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote \
 -Dcom.sun.management.jmxremote.port=12345 \
 -Dcom.sun.management.jmxremote.authenticate=true \
 -Dcom.sun.management.jmxremote.password.file=/opt/tomcat/conf/jmxremote.password \
 -Dcom.sun.management.jmxremote.access.file=/opt/tomcat/conf/jmxremote.access \
 -Dcom.sun.management.jmxremote.ssl=false \
 -Djava.rmi.server.hostname=192.168.80.134"

[root@java-client ~]# vim /opt/tomcat/conf/jmxremote.password
monitorRole  1234321
controlRole  1234567
[root@java-client ~]# vim /opt/tomcat/conf/jmxremote.access
monitorRole readonly
controlRole readwrite
[root@java-client ~]# chmod 600 /opt/tomcat/conf/jmxremote.access
[root@java-client ~]# chmod 600 /opt/tomcat/conf/jmxremote.password

# /opt/tomcat/bin/startup.sh

Client đã setting password xong. Giờ cần khai báo user/pass cho zabbix-server
Cách 1: Vào sửa từng Item trong Template


Cách 2: Export Template ra, sửa trực tiếp tất cả iteam trong file .xml và Import lại

Ta Replace All
                    <username/>
                    <password/>
Thành
                    <username>monitorRole</username>
                    <password>1234321</password>
Hoặc có thể sử dụng MACRO của zabbix thay cho trường Username/pass cũng được.

                    <username>{$USER_JMX}</username>
                    <password>{$PASS_JMX}</password>








Phần 4: Fix lỗi template Tomcat7/8  zabbix not-supported.



VD: Nhìn trên zabbix ta có Item : Template App Apache Tomcat JMXhttp-8080 threads max
Có key: jmx["Catalina:type=ThreadPool,name=http-8080",maxThreads]

Ta sử dụng Jconsole / Mbeans để tìm vị trí của nó trong tree

Tomcat version 7/8 sử dụng connector NIO. Vậy ta có kết luận là Zabbix đang gọi sai Name trong ThreadPool

Ta vào Template của zabbix, sửa lại theo đúng tên như sau:


jmx["Catalina:type=ThreadPool,name=http-8080",maxThreads]
Sửa thành:
jmx["Catalina:type=ThreadPool,name=\"http-nio-8080\"",maxThreads]
-------------------------------------------------------
Ngoài ra ta có thể tải check_jmx của nagios để check bằng console

Ta chạy lệnh
[root@zabbix-server]# ./check_jmx -U  service:jmx:rmi:///jndi/rmi://192.168.80.134:12345/jmxrmi -O "Catalina:type=ThreadPool,name=\"http-nio-8080\"" -A maxThreads
JMX OK maxThreads=200
Lệnh check_jmx chính là chạy :
[root@zabbix-server]#  java -cp jmxquery.jar org.nagios.JMXQuery -U  service:jmx:rmi:///jndi/rmi://192.168.80.134:12345/jmxrmi -O "Catalina:type=ThreadPool,name=\"http-nio-8080\"" -A maxThreads
JMX OK maxThreads=200



Debug exec pod with no any command support

  Một ngày đẹp trời pod bị lỗi. Bạn thử ngay lệnh "kubectl exec -it ..." vào pod kiểm tra. Nhưng quãi đạn, pod không hỗ trợ bất kỳ...