Realtime event logging สำหรับช่วยตรวจเว็บไซต์ “Sentry”

วันนี้มีโอกาสช่วยเพื่อนลง Tools ตัวหนึ่ง ที่ชื่อว่า Sentry ซึ่งเป็นซอฟต์แวร์ที่ไม่รู้จักมาก่อนแต่อย่างใด ฮาๆ ไม่รู้ด้วยซ้ำว่ามันทำอะไรได้บ้าง แต่เนื่องจากถูกขอให้ลงก็เลยต้องลง และพอได้ลงแล้วก็ไหนๆก็มี Blog เลยมาเขียนเก็บเอาไว้หน่อยดีกว่า เผื่อวันหน้าถ้าลืมหรือต้องลงใหม่จะได้ไม่ลำบากนัก (พูดง่ายๆ จดโน๊ตเอาไว้นั้นเอง) อนึ่งก็เพราะยังไม่มี entry ไหนที่เกี่ยวกับเรื่องงานเลย มีแต่เรื่องความสนใจส่วนตัวล้วนๆ ดังนั้น entry นี้เลยอยากมาพูดถึงเรื่องงานกันซักหน่อยแล้วกัน ฮาๆ

Sentry คืออะไร? ถ้าถามเอาขำๆ พูดชื่อนี้ขึ้นมาเนี่ย ผมก็นึกถึงไอ้ตัวนี้ใน Star Craft เลยครับ

PCG213.feat_starcraft2_2.p_sentry--article_image

ซึ่งแน่นอนครับว่ามันไม่ใช่ ฮาๆ สำหรับ Sentry ที่ผมจะพูดถึงใน Entry นี้นั้น นิยามของมันก็คือ

Sentry is a realtime event logging and aggregation platform. At its core it specializes in monitoring errors and extracting all the information needed to do a proper post-mortem without any of the hassle of the standard user feedback loop.

ก๊อปต้นฉบับภาษาอังกฤษมาจากเว็บเผื่อตัวเองจะแปลผิด lolz สรุปแล้วมันคือ ตัวช่วยดักเหตุการณ์ (Event Logging) โดยมันจะช่วยเอาพวก stack error ต่างๆ มาแสดงให้เห็นในหน้าตาที่สวยงาม อะไรทำนองนั้น และเพื่อให้ Developer ไม่ต้องมานั่งขุดหา Error Log เอาเองจาก /var/log/httpd อะไรเทือกนั้น เวลาที่เว็บไซต์มีปัญหา จะได้หาสาเหตุได้ว่าเกิดจาก function ไหนเจ๊ง ทำอะไรผิด มี error code เท่าไหร่ รายละเอียดเชิงลึก ผมคงไม่อธิบายครับ ยังรู้จักแค่งูๆ ปลาๆ

สำหรับการทำงานนั่น Sentry เป็น Tools ที่เขียนมาด้วยภาษางู Python ทำงานบน Virtualenv ที่เป็น Django แถมขี่อยู่บน Web Server Service เล็กๆที่ชื่อว่า Gunicorn อีก แต่ไม่เป็นไร มันจะลงทั้งหมดไม่ยากเพราะทางคนเขียนโปรแกรมได้ทำ Easy Install เอาไว้แล้ว ดังนั้นก็ลงตามมันแม่ง… ที่อธิบายคือแค่จดเอาไว้ว่าตัวเองก็รู้มาแบบนี้ ฮาๆ ส่วนหน้าตาโปรแกรมคร่าวๆ ก็จะเป็นแบบนี้นะ

group_list

event

dashboard

สำหรับเว็บไซต์หลักของโค้ดอยู่ที่ https://github.com/getsentry/sentry ตัวโปรแกรมเป็น Opensource สามารถติดตั้งเองได้ แต่ถ้าใครไม่อยากลงเอง หรือไม่มีเครื่องลงแล้วอยากใช้ระบบตัวนี้ก็สามารถใช้บริการได้ที่ https://getsentry.com ซึ่งทางผู้พัฒนาก็เปิดให้เช่าใช้ตัวซอฟต์แวร์บนโฮสต์ของเค้าเอง ตามราคา

2014-02-25 22_49_50-Plans and Pricing • Sentry

ตอนแรกเพื่อนผมก็ลองเช่าใช้บริการ (ลองแบบ Trial นะ) แล้วพบว่ามันช้า เนื่องจาก Server ที่ทางผู้ให้บริการนั้นเปิดให้เช่ามันอยู่เมืองนอก (อยู่ที่ไหนก็ไม่รู้ เอาเป็นว่าช้า) ปัญหาและสาเหตุเรื่องความช้าเราจะไม่พูดถึง เอาเป็นว่า มันช้า งั้นเราเอามาลงเองเลยละกัน ไหนๆ มันก็แจกฟรีให้เอาไปลงใช้เองได้อยู่แล้ว เย้ lolz เพื่อนก็มาใช้กูลง โอเคลงก็ลง

Requirement

เนื่องจากมันทำงานด้วย python ซึ่งมีทุกระบบปฏิบัติการอยู่แล้ว ดังนั้นก็คงลงได้หมด แต่ในเคสผมนั้น เลือกลงบนระบบปฏิบัติการ Linux Debian 7.3 ก็จะอิงตามนี้ละกัน

  • หลังจากติดต่อ Debian เสร็จแล้วก็ลง Python ซึ่งมีตัวสำคัญที่ต้องลงดังนี้ apt-get install python python-setuptools python-mysqldb python-dev build-essential (จะใช้ aptitude install เพื่อให้ง่ายก็ได้)
  • ตัวระบบใช้ฐานข้อมูล มันแนะนำสองตัวคือ Postgres ซึ่งมัน recommend แต่กูใช้ไม่เป็น เลยใช้อีกตัวคือ MySQL แต่มันมีตัวที่ดีกว่าและทดแทนกันได้คือ MariaDB ดังนั้นลง MariaDB ใช้แทนจ้า
  • ลง mariaDB จาก Repo ก็แอดๆ ไป https://downloads.mariadb.org/mariadb/repositories/#mirror=yamagata-university ลงให้เสร็จเซ็ตพาสให้เรียบร้อย
  • aptitude install mariadb-server
  • ติดตั้ง VirtualENV ด้วยคำสั่ง easy_install -UZ virtualenv
  • แล้วต่อด้วย virtualenv /var/www/sentry/
  • Activate virtualen source /var/www/sentry/bin/activate
  • เข้าไปที่ Path ด้านใน สั่ง easy_install -UZ sentry[mysql]
  • ถ้าขั้นตอนนี้ไม่ผิดพลาดอะไร ตัว easy_install จะไปโหลด package ที่มัน dependency ให้เอง นอนรอไป แต่ถ้าขาดตกอะไรก็ตามไปลงตามที่กล่าวไว้ด้านบน
  • เมื่อลงเสร็จจะมีคำสั่ง sentry ให้พิมพ์เล่น ก็รัน sentry init /etc/sentry.conf.py 1 ครั้ง เพื่อให้มันสร้างไฟล์ config ให้เรา

เข้าไปแก้ config /etc/sentry.conf.py นิดหน่อย เพื่อให้มันใช้ MariaDB แทน

from sentry.conf.server import *

import os.path

CONF_ROOT = os.path.dirname(__file__)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'sentry',
        'USER': 'root',
        'PASSWORD': 'yourpassword',
        'HOST': 'localhost',
        'PORT': '',
    }
}

ด้านล่างของ config จะมีส่วนของการเซ็ตค่าการส่งอีเมลหรือการผูกกับ API ต่างๆ มีผูกไป Twitter , Facebook, Trello ด้วย

หลังจากแก้ Config จบแล้ว ก็สั่งคำสั่งเพื่อรันครั้งแรก

sentry --config=/etc/sentry.conf.py start

มันก็จะไปสร้างไฟล์บลาๆ รอซักพักใหญ่ๆเลย จนมัน Run ขึ้น สำหรับ Default Port คือ 9000 ก็สามารถเข้าได้ด้วย URL:9000 (ถ้าจะแก้ให้มันรันพอร์ตอื่นก็แก้ได้ใน config)

สำหรับ User นั้นก็ต้องสร้าง Admin ด้วยคำสั่ง sentry –config=/etc/sentry.conf.py createsuperuser มันจะให้ใส่ User, Email, Password ก็ใส่ไป เป็นอันเสร็จ

ลองเข้าเว็บดู…. เนื่องจากมันรันด้วย Python เลยสงสัยว่ามันจะปิดตัวเองไหมเมื่อปิดหน้าต่าง พบว่ามันไม่ได้ปิดตัวเองลงซะทีเดียว เพราะมันมี Gunicorn คอยคุมอยู่ด้วย แต่ทางผมก็ได้เขียน Init Script ขึ้นมา เพื่อให้สามารถสั่ง Start/Stop ได้ง่ายขึ้น งานนี้ได้ @zephythor และ @somsak มาช่วยเขียน เย้ๆ

#!/bin/sh
### END INIT INFO
#set -x
PATH=/bin:/usr/bin:/sbin:/usr/sbin
DESC="sentry daemon"
NAME=sentry
DAEMON=/usr/local/bin/sentry
ARGS="--config=/etc/sentry.conf.py start"
LOG="/var/log/sentry.log"
PIDFILE=/var/run/sentry.pid
SCRIPTNAME=/etc/init.d/"$NAME"

test -f $DAEMON || exit 0

. /lib/lsb/init-functions

# Parse the system's environment
if [ "$READ_ENV" = "yes" ] ; then
    parse_environment
fi

case "$1" in
start)  log_daemon_msg "Starting sentry daemon" "sentry"
        start-stop-daemon -p $PIDFILE -m --no-close --oknodo --background --start --exec $DAEMON -- $ARGS > $LOG
        log_end_msg $?
        ;;
stop)   log_daemon_msg "Stopping sentry daemon" "sentry"
        start-stop-daemon -p $PIDFILE --stop
        RETVAL=$?
        [ $RETVAL -eq 0 ] && [ -e "$PIDFILE" ] && rm -f $PIDFILE
        log_end_msg $RETVAL
        ;;
restart) log_daemon_msg "Restarting sentry daemon" "sentry"
        $0 stop
        $0 start
;;
reload|force-reload) log_daemon_msg "Reloading sentry daemon" "sentry"
        # cron reloads automatically
        log_end_msg 0
        ;;
status)
        status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $?
        ;;
*)      log_action_msg "Usage: /etc/init.d/sentry {start|stop|status|restart|reload|force-reload}"
        exit 2
        ;;
esac
exit 0

สร้างใส่เอาไว้ใน /etc/init.d/sentry จากนั้นก็สั่ง update-rc.d -f sentry start เพื่อให้มันรันเองตอนเปิดเครื่อง เสร็จ….

แต่ถ้าจะให้มัน Run พอร์ต 9000 แล้วมี Apache หรือ Nginx รันอยู่พอร์ต 80 อยู่ เพื่อเอาไว้ทำอย่างอื่นด้วยก็ทำ Reverse Proxy เอา บน Apache ก็ทำง่ายๆ ด้วยการ  a2enmod proxy_http แล้วก็ a2enmod headers แล้วแก้ apache2.conf ยัด

ProxyPass / http://localhost:9000/
ProxyPassReverse / http://localhost:9000/
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https" env=HTTPS

ก็จบล่ะ…

คู่มือการติดตั้งแบบละเอียด ถ้าไม่ดูจากของผมก็ไปดูที่ http://sentry.readthedocs.org/en/latest/quickstart/ บล็อคนี้เขียนแบบจดโน๊ตเท่านั้น อย่าลอกเลียนแบบ 555+

สรุปแล้วก็เป็นซอฟต์แวร์ที่ดี รองรับหลายภาษาดี ใครที่เขียนเว็บ php แล้วอยากได้ Tools เอาไว้ error ของ Use เซ่อๆ ที่ใช้งานอยู่ แต่บอกเราไม่ได้ว่าปัญหานั้นคืออะไรก็ลองเอาไปใช้ดู เผื่อจะเป็นตัวช่วยในการพัฒนาเว็บได้ดี จะได้รู้ว่าควรแก้อะไรตรงไหน….

การใช้งานก็สร้าง Project เป็นเว็บที่เราจะตรวจสอบ จากนั้นมันจะมีโค้ดภาษาให้เราเอาไปแทรกในโค้ด แล้วมันจะคอย Tracker ให้

2014-02-25 23_27_14-Thairath Video Reporter _ Sentry

2014-02-25 23_27_50-No query results for model [Account]. _ Thairath Video Reporter _ Sentry

ดูดีแหะ…..แต่ใช้ไม่เป็น…. ให้ Dev ใช้ไปละกันเน๊อะ หึหึ

0 Total Views 0 Views Today

Leave a Reply

Your email address will not be published.