Lập trình – Log query database cho drupal

Bước 1: Thêm thư viện drupal/monolog

#composer.json
"drupal/monolog": "^1.3"

Bước 2: Thêm file monolog.services.yml

#sites/default/monolog.services.yml
parameters:
  monolog.channel_handlers:
    default: ['rotating_file']
    php: ['file']
  monolog.processors: ['message_placeholder', 'current_user', 'request_uri', 'ip', 'referer']

services:
  monolog.handler.browser_console:
    class: Monolog\Handler\BrowserConsoleHandler
    arguments: ['1', false]
  monolog.handler.file:
    class: Monolog\Handler\RotatingFileHandler
    arguments: ['/var/log/drupal-application.log', '30', '200', false]
  monolog.handler.rotating_file:
    class: Monolog\Handler\RotatingFileHandler
    arguments: ['/var/log/drupal-debug.log', 10, 'monolog.level.debug']

Bước 3: Sửa file index.php (các đoạn code có comment)

//icovn-import Database
use Drupal\Core\Database\Database;
use Drupal\Core\DrupalKernel;
use Symfony\Component\HttpFoundation\Request;

$autoloader = require_once 'autoload.php';

$kernel = new DrupalKernel('prod', $autoloader);

$request = Request::createFromGlobals();

//icovn-start log query before handle request
Database::startLog('views');

$response = $kernel->handle($request);
$response->send();

//icovn-start write query log
\Drupal::logger('php')->error('Start write query log.');
$queries = Database::getLog('views');
foreach ($queries as $query) {
   $query_string = strtr($query['query'], $query['args']);
   \Drupal::logger('php')->error('----------------------------------------------------------------------');
   \Drupal::logger('php')->error("query: \n\r" . $query_string ."\n\r|");
}
\Drupal::logger('php')->error('End write query log.');

$kernel->terminate($request, $response);

Ghi chú – Kiểm tra hiệu năng Postgres

Để kiểm tra hiệu năng của Postgres ta có thể dùng tool có sẵn pgbench như sau

Tạo dữ liệu test

pgbench -i -h POSTGRES_HOST -p POSTGRES_PORT -U POSTGRES_USER -d POSTGRES_DATABASE

Kiểm tra hiệu năng với 10 connections

pgbench -c 10 -h POSTGRES_HOST -p POSTGRES_PORT -U POSTGRES_USER -d POSTGRES_DATABASE

Với Ubuntu nếu chỉ cái postgres-client mà chưa có pgbench thì có thể cài thêm như sau

 sudo apt-get install postgresql-contrib

Ghi chú – Giải pháp sử dụng Jenkin slave chạy docker cập nhật image mới lên kubernetes

Mình sử dụng Rancher2 để triển khai kubernetes cluster trên các hệ thống mình chịu trách nhiệm quản lý và kỹ thuật.

Trước đây mình thường dùng rke tool để triển khai k8s nhưng hiện giờ mình dùng script để triển khai k3s.

Giải pháp CI/CD của mình là toàn bộ triển khai trên docker hết:

  • Jenkin
  • Jenkin slave
  • GitLab
  • Jira

Trước đây mình thường dùng rancher cli để cập nhật image mới lên kubernetes. Địa chỉ Rancher và token mình để trong credentials của Jenkin

Nhưng gần đây mình gặp vấn đề về certificate khi rancher chạy trong môi trường Air gapped hoặc VPN (chỉ có thể truy cập Rancher GUI từ VPN). Để giải quyết vấn đề này mình chuyển sang dùng kubectl trực tiếp bằng cách mount file ~/.kube/config từ configMap vào Jenkin slave.

Câu lệnh update image trước đây

rancher kubectl -n ${env.RANCHER_NAMESPACE} set image deployment.v1.apps/${env.APPLICATION} ${env.APPLICATION}=${env.DOCKER_IMAGE}

Câu lệnh mới

kubectl -n ${env.RANCHER_NAMESPACE} set image deployment.v1.apps/${env.APPLICATION} ${env.APPLICATION}=${env.DOCKER_IMAGE}

Ghi chú – Xử lý lỗi oom_score_adj khi chạy dind trên kubernetes

Khi chạy docker in docker (dind) trên k3s mình gặp lỗi

io.containerd.runc.v2: failed to adjust OOM score for shim: set shim OOM score: write /proc/721/oom_score_adj: invalid argument

Lỗi này là do

  • Trước đây mình dùng docker image docker:dind, image này vừa được cập nhật lên version dind:20-dind và version này sử dụng containerd v1.4.3
  • k3s của mình sử dụng containerd version cũ hơn
    •  k3s: v1.18.9+k3s1
    • containerd: v1.3.3-k3s2

Giải pháp 

Để xử lý vấn đề này mình rollback dind về version docker:19.03.12-dind

Ghi chú – Xoá namespace trên kubernetes khi bị stuck ở trạng thái terminating

Chạy 2 lệnh sau 

kubectl patch ns NAMESPACE_STUCK -p '{"metadata":{"finalizers":null}}';
kubectl delete ns NAMESPACE_STUCK

Cần làm – Video Conference Wrapper

Vấn đề: Khi sử dụng một nền tảng video conference duy nhất thì có rủi ro nền tảng đó có vấn đề, ảnh hưởng trải nghiệm của người dùng

Giải pháp: Xây dựng module cho phép người dùng thay đổi nền tảng video (vd: Zoom, Google Meet, …)

  • Có SDK để nhúng được vào App, Web
  • Có thể record theo từng channel
  • Có callback để bắt từng event realtime
  • Có hỗ trờ audio fallback
  • Độ trễ trong điều kiện mạng ổn định là 300ms, package lost < 3%
  • Băng thông down/up tối thiểu để dùng được của enduser là 200kbps

Các hệ thống cần có để phát triển phần mềm

TênYêu cầu
1Hệ thống quản trị source code– Sử dụng GIT
– Dữ liệu được backup hàng ngày và đẩy vào nơi lưu trữ an toàn (vd: cloud)
2Hệ thống quản trị công việcTham khảo Jira, Open Project
3Hệ thống quản trị tài liệuTham khảo Conflunce, Wiki
4Hệ thống tích hợp triển khai (CI/CD)Tham khảo Jenkin
5Hệ thống server test
6Hệ thống cảnh báo giám sátGiám sát server, ứng dụng
7Hệ thống log tập trung– Tập trung log của server, ứng dụng về một chỗ
– Cho phép DEV có thể xem lỗi các môi trường triển khai bằng giao diện web
– Xác thực và phân quyền người dùng chỉ cho phép xem log các phân hệ được phép (vd: DEV chỉ xem log ứng dụng, …)

Quy tắc gửi dữ liệu qua headers khi gọi API từ client

TênGiá trịVí dụNền tảng áp dụngGhi chú
AppNameTên của ứng dụngCrmWeb, CustomerCareAndroidiOS, Android, Web
AppVersionVersion của ứng dụng3.2.1_56iOS, Android, Web
OSHệ điều hành của ứng dụngWeb có thể truyền thông số User-AgentiOS, Android, Web
DeviceTokenMã thiết bịcLGiX1hlUro:APA91bHfUMbUyJq5ZcAbnZJApF61_xSUHFfYBnbsiOS, Android
UserNameTên của người dùng0904kidiOS, Android, Web
UserRoleVai trò của người dùngKIDiOS, Android, Web