Đợt này làm về tracing: mục đích là xem các API gọi nhau lâu không, ràng buộc thế nào (cái nào gọi tới cái nào), cái nào bị tắc còn tối ưu, 1 đơn hàng từ lúc bắt đầu đến lúc kết thúc mất bao nhiêu thời gian... Ngắm được thằng Zipkin, làm các bước triển khai demo xem thế nào. Chọn kiểu chạy file JAR cho nó đơn giản
Mặc định chạy nó sẽ lưu log lên RAM, nên sẽ thay đổi để nó lưu log vào MySQL. À server tiến hành demo là Debian 9 (stretch) nhé. Tiện thì nói luôn check xem server đang chạy OS gì thì: cat /etc/os-release
Okie quay lại, chạy Zipkin nào
STORAGE_TYPE=mysql MYSQL_USER=huypv MYSQL_PASS=ahihi nohup java -jar zipkin.jar &
Chạy xong vào đây được là okie http://your.server:9411/zipkin/
Dùng thư viện PHP code đẩy log vào ngon choét: composer require openzipkin/zipkin
https://github.com/openzipkin/zipkin-php
Giờ muốn tùy chỉnh thêm đó là đẩy message (JSON) vào queue của RabbitMQ, Zipkin lấy log từ đó sang. Hay nói khác đi là dùng RabbitMQCollector thay vì HTTP Collector
Có ví dụ sẵn ở đây https://github.com/openzipkin/zipkin/tree/master/zipkin-collector/rabbitmq
Tạo 1 file JSON lưu thông tin log (spans) mẫu, nếu ko biết tạo thì lên lại http://your.server:9411/zipkin/ tìm rồi download 1 cái về và sửa text, time đi
Chạy lệnh: rabbitmqadmin publish exchange=amq.default routing_key=zipkin < sample-spans.json
À liên quan là phải cài đặt RabbitMQ nhé. Cứ theo hướng dẫn mà làm thôi, đang trên server cài Debian nên nhảy vô link này https://www.rabbitmq.com/install-debian.html
Đù mé, dài vãi lồng, thường thì có các kiểu cài ăn sẵn, build từ source. Thôi, ăn sẵn cho nó sướng mồm. Chọn cái này "Option A: using apt repositories on Cloudsmith (quick start script)" rồi làm theo
Sau khi start ngon nghẻ, chạy systemctl status rabbitmq-server sẽ thấy màu xanh active (running) là chuẩn rồi. Muốn vào link web quản trị http://your.server:15672/ thì làm như sau:
rabbitmq-plugins enable rabbitmq_management
Xong éo đăng nhập được, vì vào bằng tên miền (public internet) thì phải thêm user, gán nhóm gán quyền: (ở đây là huypv, mật khẩu là matkhauxxx)
rabbitmqctl add_user huypv matkhauxxx
rabbitmqctl set_user_tags huypv administrator
rabbitmqctl set_permissions -p / huypv ".*" ".*" ".*"
Vào lại và đăng nhập thử ngon ngay
Chạy lại Zipkin để dùng RabbitMQ Collector
RABBIT_ADDRESSES=localhost STORAGE_TYPE=mysql MYSQL_USER=huypv MYSQL_PASS=ahihi nohup java -jar zipkin.jar &
Quay lại lệnh đẩy message JSON mẫu vào RabbitMQ
rabbitmqadmin publish exchange=amq.default routing_key=zipkin < sample-spans.json
(nếu chạy cái này trước mà chưa chạy Zipkin phía trên thì sẽ bị báo "message published but NOT routed")
Ồ nhưng éo có file rabbitmqadmin rồi, lại phải kiếm, tải nó ở đây nè http://your.server:15672/cli/index.html - Nhớ download về xong chmod +x thì mới chạy được nhé
Tèn ten, mọi thứ cứ gọi là nuột. Từ JSON message ở RabbitMQ đã được đẩy vào log bên Zipkin.
Code PHP nên lại phải tìm hiểu xem nếu dùng PHP thì làm sao để nó giống cái lệnh mẫu kia. Okie, chiến tiếp nào, kiếm được lib này php-amqplib/php-amqplib rồi code 1 file send.php như thế này
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$channel->queue_declare('zipkin', 'direct', false, false, false);# tham số thứ 2 là direct mới được nhé
$txtContent = file_get_contents('sample-spans.json');
$msg = new AMQPMessage($txtContent);
$channel->basic_publish($msg, '', 'zipkin');
echo 'Ngon nghe';
$channel->close();
$connection->close();
Chú ý cái 'zipkin' nó chính là giá trị của routing_key trong mẫu. Phù, cơ bản là ổn rồi đó