{"data":[{"id":104838,"title":"Buy Telegram Accounts, Currency & Items Safely on iGVault","slug":"ym4005Ej491","url":"https:\/\/viblo.asia\/p\/buy-telegram-accounts-currency-items-safely-on-igvault-ym4005Ej491","user_id":201891,"moderation":"discarded","transliterated":"buy-telegram-accounts-currency-items-safely-on-igvault","contents_short":"Buy Telegram Accounts, Currency & Items Safely on iGVault\n24 hours response\/(Contact US)\n\n\u27a4 WhatsApp: +1 (903) 702-9701\n\t\u27a4 Telegram: @usasvcit\n\u27a4 Email: usasvcit@gmail.com\nTelegram has become one of the most widely used digital communication platforms, connecting individuals, communities, businesses, educators, and organizations around the world. A Telegram account is more than a messaging profi...","contents":"Buy Telegram Accounts, Currency & Items Safely on iGVault\n24 hours response\/(Contact US)\n\n\u27a4 WhatsApp: +1 (903) 702-9701\n\t\u27a4 Telegram: @usasvcit\t\n\u27a4 Email: usasvcit@gmail.com \nTelegram has become one of the most widely used digital communication platforms, connecting individuals, communities, businesses, educators, and organizations around the world. A Telegram account is more than a messaging profile; it can represent a person\u2019s digital identity, communication habits, and ability to participate in online communities responsibly.\nUnderstanding how Telegram accounts work and how to maintain a clean digital history is an important part of modern digital literacy. A well-managed account reflects organized communication, responsible participation, and awareness of online practices. These skills are useful for students, professionals, entrepreneurs, and anyone who uses digital platforms daily.\nIn everyday life, messaging applications have become essential tools for collaboration, learning, customer communication, and personal connections. Knowing how to manage conversations, organize information, protect personal details, and use digital features effectively can improve productivity and confidence when interacting online.\nLearning about Telegram account management also provides broader educational benefits. It introduces important concepts such as digital identity, online communication skills, privacy awareness, and responsible technology use. These lessons can be applied across many platforms, not only messaging applications.\nThis guide explains Telegram accounts from an educational perspective. It explores their features, practical applications, learning opportunities, credibility factors, productivity benefits, and daily importance. Throughout this article, usasvcit is mentioned only as a source of general educational information and guidance related to digital account practices.\nSection 1: Understanding Telegram Accounts\nWhat Is a Telegram Account?\nA Telegram account is a personal digital profile that allows users to communicate through messages, voice calls, group discussions, channels, and various sharing features. It connects a user with a global network while providing tools for organized communication.\nThe structure of a Telegram account includes basic profile information, contact connections, conversation history, and settings that allow users to personalize their experience. Understanding these elements helps users make better decisions about how they communicate online.\nTelegram also provides features designed for different communication needs. Individuals can use it for personal conversations, learning groups, professional discussions, and community participation. Each feature supports different forms of digital interaction.\nDigital Significance of Account History\nA digital history represents the way an account has been used over time. For Telegram users, this can include communication patterns, participation in groups, shared information, and interactions with online communities.\nMaintaining a clean digital history means developing responsible habits, communicating respectfully, and managing online activities thoughtfully. These habits contribute to a more positive digital presence.\nDigital reputation is becoming increasingly important because online activities can influence professional networking, educational opportunities, and collaboration. Understanding this connection helps users become more aware of their online behavior.\nSection 2: Practical Applications\nEveryday Uses of Telegram Accounts\nTelegram accounts provide many practical benefits for communication, organization, and information sharing. When used responsibly, they can support both personal and professional activities.\nReal-life applications include:\n\u25cf\tStaying connected with family, friends, and communities.\n\u25cf\tParticipating in educational discussion groups.\n\u25cf\tCoordinating team projects and professional conversations.\n\u25cf\tSharing documents, updates, and useful resources.\n\u25cf\tOrganizing personal communication more efficiently.\nSupporting Digital Productivity\nBeyond messaging, Telegram can be used as a productivity tool. Many users rely on organized chats, saved messages, and channels to manage information and stay connected with important resources.\nPractical productivity benefits include:\n\u25cf\tCreating organized communication spaces.\n\u25cf\tSaving important information for future reference.\n\u25cf\tFollowing educational channels and learning resources.\n\u25cf\tImproving teamwork through quick communication.\n\u25cf\tReducing unnecessary confusion through structured conversations.\nDeveloping good Telegram habits helps users understand broader digital organization skills that are useful across many online platforms.","published_at":"2026-08-05T18:15:04.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T18:15:11.000000Z","edited_at":"2026-08-05T18:15:03.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":2,"points":0,"views_count":0,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/bf1c29f6-0ec0-4db0-ab5e-c789ea6cc477.png","user":{"data":{"id":201891,"url":"https:\/\/viblo.asia\/u\/usasvcit4s","avatar":null,"name":"Buy Telegram Accounts","username":"usasvcit4s","followers_count":0,"reputation":0,"posts_count":0,"banned_at":"2026-08-05T18:15:06.000000Z","level_partner":null,"following":false}},"tags":{"data":[{"slug":"buy-telegram-accounts-in-usa","name":"Buy Telegram Accounts in USA"}]},"commentators":{"data":[]}},{"id":104750,"title":"PHP v\u00e0 MySQL B\u00e0i 2: H\u01b0\u1edbng d\u1eabn c\u00e0i \u0111\u1eb7t m\u00f4i tr\u01b0\u1eddng l\u1eadp tr\u00ecnh v\u00e0 \"v\u0169 kh\u00ed\" VS Code","slug":"oKLnqXegJQO","url":"https:\/\/viblo.asia\/p\/php-va-mysql-bai-2-huong-dan-cai-dat-moi-truong-lap-trinh-va-vu-khi-vs-code-oKLnqXegJQO","user_id":182653,"moderation":null,"transliterated":"php-va-mysql-bai-2-huong-dan-cai-dat-moi-truong-lap-trinh-va-vu-khi-vs-code","contents_short":"Ch\u00e0o c\u00e1c b\u1ea1n! \u1ede B\u00e0i 1, ch\u00fang ta \u0111\u00e3 bi\u1ebft PHP c\u1ea7n m\u1ed9t Web Server (nh\u01b0 Apache\/Nginx) v\u00e0 MySQL \u0111\u1ec3 ch\u1ea1y [cite: 16]. Tuy nhi\u00ean, m\u00e1y t\u00ednh c\u00e1 nh\u00e2n c\u1ee7a ch\u00fang ta (Windows, Mac) m\u1eb7c \u0111\u1ecbnh kh\u00f4ng c\u00f3 s\u1eb5n nh\u1eefng th\u1ee9 n\u00e0y. N\u1ebfu b\u1ea1n ch\u1ec9 click \u0111\u00fap v\u00e0o file .php nh\u01b0 HTML th\u00f4ng th\u01b0\u1eddng, tr\u00ecnh duy\u1ec7t s\u1ebd ch\u1ec9 hi\u1ec3n th\u1ecb nh\u1eefng d\u00f2ng code v\u00f4 h\u1ed3n.\n\n\u0110\u1ec3 m\u00e1y t\u00ednh c\u00e1 nh\u00e2n c\u00f3 th\u1ec3 \u0111\u00f3ng vai tr\u00f2 nh\u01b0 m\u1ed9t Server th\u1ef1c th\u1ee5 (g\u1ecdi l\u00e0 Localhost...","contents":"Ch\u00e0o c\u00e1c b\u1ea1n! \u1ede B\u00e0i 1, ch\u00fang ta \u0111\u00e3 bi\u1ebft PHP c\u1ea7n m\u1ed9t Web Server (nh\u01b0 Apache\/Nginx) v\u00e0 MySQL \u0111\u1ec3 ch\u1ea1y [cite: 16]. Tuy nhi\u00ean, m\u00e1y t\u00ednh c\u00e1 nh\u00e2n c\u1ee7a ch\u00fang ta (Windows, Mac) m\u1eb7c \u0111\u1ecbnh kh\u00f4ng c\u00f3 s\u1eb5n nh\u1eefng th\u1ee9 n\u00e0y. N\u1ebfu b\u1ea1n ch\u1ec9 click \u0111\u00fap v\u00e0o file `.php` nh\u01b0 HTML th\u00f4ng th\u01b0\u1eddng, tr\u00ecnh duy\u1ec7t s\u1ebd ch\u1ec9 hi\u1ec3n th\u1ecb nh\u1eefng d\u00f2ng code v\u00f4 h\u1ed3n.\n\n\u0110\u1ec3 m\u00e1y t\u00ednh c\u00e1 nh\u00e2n c\u00f3 th\u1ec3 \u0111\u00f3ng vai tr\u00f2 nh\u01b0 m\u1ed9t Server th\u1ef1c th\u1ee5 (g\u1ecdi l\u00e0 **Localhost**), ch\u00fang ta c\u1ea7n c\u00e0i \u0111\u1eb7t m\u00f4i tr\u01b0\u1eddng. D\u01b0\u1edbi \u0111\u00e2y l\u00e0 3 gi\u1ea3i ph\u00e1p ph\u1ed5 bi\u1ebfn nh\u1ea5t t\u1eeb c\u01a1 b\u1ea3n \u0111\u1ebfn \"hardcore\".\n\n---\n\n## 1. L\u1ef1a ch\u1ecdn m\u00f4i tr\u01b0\u1eddng: XAMPP vs. Laragon vs. Docker\n\n### C\u00e1ch 1: Laragon - L\u1ef1a ch\u1ecdn s\u1ed1 1 cho Windows (Khuy\u00ean d\u00f9ng)\nN\u1ebfu b\u1ea1n \u0111ang d\u00f9ng Windows, h\u00e3y t\u1ea1m qu\u00ean XAMPP \u0111i v\u00e0 \u0111\u1ebfn v\u1edbi Laragon. \u0110\u00e2y l\u00e0 c\u00f4ng c\u1ee5 hi\u1ec7n \u0111\u1ea1i, c\u1ef1c k\u1ef3 nh\u1eb9, kh\u1edfi \u0111\u1ed9ng trong ch\u1edbp m\u1eaft v\u00e0 c\u00f3 nh\u1eefng t\u00ednh n\u0103ng \"\u0103n ti\u1ec1n\":\n*   **T\u1ef1 \u0111\u1ed9ng t\u1ea1o t\u00ean mi\u1ec1n \u1ea3o (Virtual Host):** Thay v\u00ec ph\u1ea3i g\u00f5 `localhost\/myproject`, Laragon t\u1ef1 \u0111\u1ed9ng t\u1ea1o cho b\u1ea1n link c\u1ef1c x\u1ecbn nh\u01b0 `myproject.test`.\n*   **C\u00e0i \u0111\u1eb7t:**\n    1.  Truy c\u1eadp trang ch\u1ee7 `laragon.org` v\u00e0 t\u1ea3i b\u1ea3n **Laragon Full**.\n    2.  C\u00e0i \u0111\u1eb7t nh\u01b0 m\u1ed9t ph\u1ea7n m\u1ec1m b\u00ecnh th\u01b0\u1eddng (`Next > Next > Install`).\n    3.  M\u1edf Laragon, b\u1ea5m **Start All**. Web Server (Apache) v\u00e0 MySQL \u0111\u00e3 s\u1eb5n s\u00e0ng!\n*   Th\u01b0 m\u1ee5c ch\u1ee9a code c\u1ee7a b\u1ea1n s\u1ebd n\u1eb1m \u1edf: `C:\\laragon\\www`.\n\n### C\u00e1ch 2: XAMPP - Huy\u1ec1n tho\u1ea1i qu\u1ed1c d\u00e2n (Windows \/ macOS \/ Linux)\nXAMPP l\u00e0 ph\u1ea7n m\u1ec1m l\u00e2u \u0111\u1eddi v\u00e0 ph\u1ed5 bi\u1ebfn nh\u1ea5t. \u0110i\u1ec3m m\u1ea1nh c\u1ee7a n\u00f3 l\u00e0 s\u1ef1 \u1ed5n \u0111\u1ecbnh v\u00e0 h\u1ed7 tr\u1ee3 \u0111a n\u1ec1n t\u1ea3ng, c\u00e1c gi\u00e1o tr\u00ecnh \u1edf tr\u01b0\u1eddng \u0111\u1ea1i h\u1ecdc h\u1ea7u nh\u01b0 \u0111\u1ec1u d\u00f9ng XAMPP.\n*   **C\u00e0i \u0111\u1eb7t:**\n    1.  V\u00e0o `apachefriends.org`, t\u1ea3i b\u1ea3n XAMPP ph\u00f9 h\u1ee3p v\u1edbi h\u1ec7 \u0111i\u1ec1u h\u00e0nh (ch\u1ecdn b\u1ea3n c\u00f3 PHP 8.x).\n    2.  C\u00e0i \u0111\u1eb7t v\u00e0 m\u1edf **XAMPP Control Panel**.\n    3.  B\u1ea5m **Start** \u1edf hai d\u00f2ng: **Apache** v\u00e0 **MySQL**. Khi ch\u1eef chuy\u1ec3n sang m\u00e0u xanh l\u00e1 l\u00e0 th\u00e0nh c\u00f4ng.\n*   Th\u01b0 m\u1ee5c ch\u1ee9a code c\u1ee7a b\u1ea1n n\u1eb1m \u1edf: `C:\\xampp\\htdocs` (Windows) ho\u1eb7c `\/Applications\/XAMPP\/xamppfiles\/htdocs` (Mac).\n\n### C\u00e1ch 3: Docker - M\u00f4i tr\u01b0\u1eddng c\u1ee7a d\u00e2n chuy\u00ean nghi\u1ec7p (DevOps)\nDocker kh\u00f4ng t\u1ea3i c\u00e1c ph\u1ea7n m\u1ec1m tr\u1ef1c ti\u1ebfp l\u00ean m\u00e1y t\u00ednh c\u1ee7a b\u1ea1n m\u00e0 ch\u1ea1y ch\u00fang trong c\u00e1c \"Container\" (th\u00f9ng ch\u1ee9a) c\u00f4 l\u1eadp.\n*   **\u01afu \u0111i\u1ec3m:** Kh\u1eafc ph\u1ee5c ho\u00e0n to\u00e0n l\u1ed7i *\"code ch\u1ea1y tr\u00ean m\u00e1y em nh\u01b0ng ch\u1ebft tr\u00ean server\"*. B\u1ea1n c\u00f3 th\u1ec3 linh ho\u1ea1t ch\u1ea1y PHP 7 cho d\u1ef1 \u00e1n A v\u00e0 PHP 8 cho d\u1ef1 \u00e1n B tr\u00ean c\u00f9ng m\u1ed9t m\u00e1y m\u00e0 kh\u00f4ng s\u1ee3 xung \u0111\u1ed9t.\n*   **L\u1eddi khuy\u00ean:** D\u00f9 \u0111\u00e2y l\u00e0 ti\u00eau chu\u1ea9n c\u1ee7a c\u00e1c c\u00f4ng ty c\u00f4ng ngh\u1ec7 l\u1edbn, nh\u01b0ng v\u1edbi ng\u01b0\u1eddi m\u1edbi b\u1eaft \u0111\u1ea7u, Docker c\u1ea5u h\u00ecnh kh\u00e1 ph\u1ee9c t\u1ea1p. Ch\u00fang ta s\u1ebd c\u00f3 m\u1ed9t b\u00e0i h\u1ecdc ri\u00eang v\u1ec1 Docker \u1edf Ph\u1ea7n 13 (B\u00e0i 94) c\u1ee7a series n\u00e0y. T\u1ea1m th\u1eddi, h\u00e3y b\u1eaft \u0111\u1ea7u b\u1eb1ng Laragon ho\u1eb7c XAMPP nh\u00e9!\n\n---\n\n## 2. Trang b\u1ecb v\u0169 kh\u00ed: Visual Studio Code (VS Code)\n\nC\u00f3 m\u00f4i tr\u01b0\u1eddng ch\u1ea1y code r\u1ed3i, gi\u1edd ch\u00fang ta c\u1ea7n m\u1ed9t c\u00f4ng c\u1ee5 \u0111\u1ec3 \"g\u00f5\" code. **Visual Studio Code (VS Code)** c\u1ee7a Microsoft hi\u1ec7n l\u00e0 tr\u00ecnh so\u1ea1n th\u1ea3o v\u00f4 \u0111\u1ed1i trong gi\u1edbi l\u1eadp tr\u00ecnh web: nh\u1eb9, mi\u1ec5n ph\u00ed v\u00e0 h\u1ed7 tr\u1ee3 v\u00f4 s\u1ed1 ti\u1ec7n \u00edch m\u1edf r\u1ed9ng (Extensions).\n\n### H\u01b0\u1edbng d\u1eabn thi\u1ebft l\u1eadp c\u01a1 b\u1ea3n:\n1.  T\u1ea3i v\u00e0 c\u00e0i \u0111\u1eb7t VS Code t\u1ea1i `code.visualstudio.com`.\n2.  M\u1edf VS Code, chuy\u1ec3n sang tab **Extensions** (bi\u1ec3u t\u01b0\u1ee3ng 4 \u00f4 vu\u00f4ng \u1edf c\u1ed9t b\u00ean tr\u00e1i ho\u1eb7c ph\u00edm t\u1eaft `Ctrl + Shift + X` tr\u00ean Windows \/ `Cmd + Shift + X` tr\u00ean Mac).\n\n### C\u00e1c Extensions b\u1eaft bu\u1ed9c ph\u1ea3i c\u00e0i cho PHP:\n\u0110\u1ec3 g\u00f5 code PHP s\u01b0\u1edbng nh\u01b0 c\u00e1c Senior, b\u1ea1n h\u00e3y t\u00ecm v\u00e0 c\u00e0i \u0111\u1eb7t c\u00e1c ti\u1ec7n \u00edch sau:\n*   **PHP Intelephense:** Ti\u1ec7n \u00edch s\u1ed1 1 cho PHP. Gi\u00fap t\u1ef1 \u0111\u1ed9ng g\u1ee3i \u00fd code, ki\u1ec3m tra l\u1ed7i c\u00fa ph\u00e1p ngay khi b\u1ea1n g\u00f5, t\u1ef1 \u0111\u1ed9ng import c\u00e1c class.\n*   **Prettier - Code formatter:** Gi\u00fap code c\u1ee7a b\u1ea1n t\u1ef1 \u0111\u1ed9ng c\u0103n l\u1ec1, th\u1ee5t d\u00f2ng \u0111\u1eb9p m\u1eaft ch\u1ec9 v\u1edbi m\u1ed9t t\u1ed5 h\u1ee3p ph\u00edm (`Shift + Alt + F` tr\u00ean Windows ho\u1eb7c `Shift + Option + F` tr\u00ean Mac).\n*   **Material Icon Theme:** Thay \u0111\u1ed5i icon c\u1ee7a c\u00e1c th\u01b0 m\u1ee5c v\u00e0 file trong project nh\u00ecn tr\u1ef1c quan v\u00e0 chuy\u00ean nghi\u1ec7p h\u01a1n.\n*   **Live Server (T\u00f9y ch\u1ecdn):** Ti\u1ec7n \u00edch tuy\u1ec7t v\u1eddi khi code HTML\/CSS, t\u1ef1 \u0111\u1ed9ng load l\u1ea1i tr\u00ecnh duy\u1ec7t khi b\u1ea1n b\u1ea5m Save.\n\n---\n\n## T\u1ed5ng k\u1ebft B\u00e0i 2\n\n\u0110\u1ebfn \u0111\u00e2y, b\u1ea1n \u0111\u00e3 ho\u00e0n t\u1ea5t vi\u1ec7c thi\u1ebft l\u1eadp m\u1ed9t \"ph\u00f2ng nghi\u00ean c\u1ee9u\" chu\u1ea9n ch\u1ec9 tr\u00ean ch\u00ednh m\u00e1y t\u00ednh c\u1ee7a m\u00ecnh:\n*   Server v\u00e0 Database \u0111\u00e3 s\u1eb5n s\u00e0ng ch\u1ea1y ng\u1ea7m (th\u00f4ng qua Laragon\/XAMPP).\n*   Tr\u00ecnh so\u1ea1n th\u1ea3o m\u00e3 l\u1ec7nh (VS Code) \u0111\u00e3 \u0111\u01b0\u1ee3c \u0111\u1ed9 th\u00eam \"\u0111\u1ed3 ch\u01a1i\".\n\nB\u00e2y gi\u1edd th\u00ec m\u1ecdi th\u1ee9 \u0111\u00e3 s\u1eb5n s\u00e0ng. \u1ede B\u00e0i 3, ch\u00fang ta s\u1ebd ch\u00ednh th\u1ee9c vi\u1ebft d\u00f2ng code PHP \u0111\u1ea7u ti\u00ean, h\u1ecdc c\u00e1ch ch\u1ea1y n\u00f3 tr\u00ean tr\u00ecnh duy\u1ec7t v\u00e0 t\u00ecm hi\u1ec3u c\u00e1c quy t\u1eafc vi\u1ebft code c\u01a1 b\u1ea3n nh\u1ea5t. \u0110\u1eebng b\u1ecf l\u1ee1 nh\u00e9!","published_at":"2026-08-05T17:22:32.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T19:00:06.000000Z","edited_at":"2026-08-04T16:23:41.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":5,"points":0,"views_count":6,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/2aed49a0-a061-4981-9ad3-8259d1f46d91.png","user":{"data":{"id":182653,"url":"https:\/\/viblo.asia\/u\/hhoang","avatar":"15b74a7e-16dd-435c-b375-62f02864e065.jpg","name":"Nguy\u1ec5n Huy Ho\u00e0ng","username":"hhoang","followers_count":144,"reputation":11227,"posts_count":987,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"avg-mysql","name":"AVG MYSQL"},{"slug":"doc-file-trong-php","name":"\u0111\u1ecdc file trong php"}]},"commentators":{"data":[]}},{"id":104831,"title":"XX7","slug":"XRJ8RoQwVGq","url":"https:\/\/viblo.asia\/p\/xx7-XRJ8RoQwVGq","user_id":201874,"moderation":"discarded","transliterated":"xx7","contents_short":"XX7 is a mobile game application distributed as an Android APK. One installation provides access to several play formats, a profile area, and an INR wallet, with phone-number account access.\n\nWebsite: https:\/\/xx7.dev\/\n\nZipcode: 400102\n\nPhone: 02222886467\n\nEmail:infor@xx7.dev\n\naddress: 185, Malad Shopping Centre, S V Road, Malad (west),Mumbai,Maharashtra\n\nHastag: #xx7 #xx7game\n\nhttps:\/\/www.faceb...","contents":"XX7 is a mobile game application distributed as an Android APK. One installation provides access to several play formats, a profile area, and an INR wallet, with phone-number account access.\n\nWebsite: https:\/\/xx7.dev\/\n\nZipcode: 400102\n\nPhone: 02222886467\n\nEmail:infor@xx7.dev\n\naddress: 185, Malad Shopping Centre, S V Road, Malad (west),Mumbai,Maharashtra\n\nHastag: #xx7 #xx7game\n\n\nhttps:\/\/www.facebook.com\/xx7dev\/\n\nhttps:\/\/twitter.com\/xx7dev\n\nhttps:\/\/www.youtube.com\/@xx7dev\/about\n\nhttps:\/\/www.pinterest.com\/xx7dev\/\n\nhttps:\/\/vimeo.com\/xx7dev\n\nhttps:\/\/www.tumblr.com\/xx7dev\n\nhttps:\/\/gravatar.com\/xx7dev\n\nhttps:\/\/www.blogger.com\/profile\/14704070734987857982\n\nhttps:\/\/www.reddit.com\/user\/xx7dev\/\n\nhttps:\/\/profile.hatena.ne.jp\/xx7dev\/profile\n\nhttps:\/\/issuu.com\/xx7dev\n\nhttps:\/\/pixabay.com\/users\/xx7dev-57016680\/\n\nhttps:\/\/disqus.com\/by\/xx7dev\/about\/\n\nhttps:\/\/500px.com\/p\/xx7dev?view=photos\n\nhttps:\/\/about.me\/xx7dev\n\nhttps:\/\/anyflip.com\/homepage\/virmn#About\n\nhttps:\/\/wakelet.com\/@xx7dev\n\nhttps:\/\/gifyu.com\/xx7dev\n\nhttps:\/\/www.magcloud.com\/user\/xx7dev\n\nhttps:\/\/www.walkscore.com\/people\/162462065846\/xx7\n\nhttps:\/\/www.twitch.tv\/xx7dev\/about\n\nhttps:\/\/pinshape.com\/users\/9029874-xx7dev?tab=designs\n\nhttps:\/\/www.gta5-mods.com\/users\/xx7dev\n\nhttps:\/\/chillspot1.com\/user\/xx7dev\n\nhttps:\/\/wibki.com\/xx7dev\n\nhttps:\/\/3dwarehouse.sketchup.com\/by\/xx7dev\n\nhttps:\/\/www.dibiz.com\/a01100862585\n\nhttps:\/\/www.invelos.com\/UserProfile.aspx?Alias=xx7dev\n\nhttps:\/\/www.skool.com\/@xx-game-9319\n\nhttps:\/\/coub.com\/xx7dev11\n\nhttps:\/\/xx7dev.blogspot.com\/2026\/08\/xx7.html\n\nhttps:\/\/www.aicrowd.com\/participants\/xx7dev\n\nhttps:\/\/www.investagrams.com\/Profile\/xx7dev\n\nhttps:\/\/bandori.party\/user\/1500726\/xx7dev\/\n\nhttps:\/\/www.iniuria.us\/forum\/member.php?709952-xx7dev\n\nhttps:\/\/illust.daysneo.com\/illustrator\/xx7dev\/\n\nhttps:\/\/www.chordie.com\/forum\/profile.php?id=2615507\n\nhttps:\/\/biomolecula.ru\/authors\/172921\n\nhttps:\/\/theafricavoice.com\/profile\/xx7dev\n\nhttps:\/\/blender.community\/xx7dev\/\n\nhttps:\/\/justpaste.it\/enc0r\n\nhttps:\/\/divisionmidway.org\/jobs\/author\/xx7dev\/\n\nhttps:\/\/lightroom.adobe.com\/u\/xx7game1\n\nhttps:\/\/kaeuchi.jp\/forums\/users\/xx7dev\/\n\nhttps:\/\/www.transfur.com\/Users\/xx7dev\n\nhttps:\/\/dreevoo.com\/profile_info.php?pid=2162492\n\nhttps:\/\/www.giveawayoftheday.com\/forums\/profile\/2045938\n\nhttps:\/\/app.talkshoe.com\/user\/xx7dev\n\nhttps:\/\/scholar.google.com\/citations?hl=en&user=wYEOawsAAAAJ\n\nhttps:\/\/www.fundable.com\/xx7-game\n\nhttps:\/\/www.fullhires.com\/author\/xx7dev\/\n\nhttps:\/\/www.instapaper.com\/p\/xx7dev\n\nhttps:\/\/pubhtml5.com\/homepage\/otbga\/\n\nhttps:\/\/safechat.com\/u\/xx780\n\nhttps:\/\/forum.issabel.org\/u\/xx7dev\n\nhttps:\/\/www.threadless.com\/@xx7dev\/activity\n\nhttps:\/\/undrtone.com\/xx7dev\n\nhttps:\/\/www.chichi-pui.com\/users\/xx7dev\/\n\nhttps:\/\/linkmix.co\/58146635\n\nhttps:\/\/www.myminifactory.com\/users\/xx7dev\n\nhttps:\/\/www.tripadvisor.de\/Profile\/xx7dev\n\nhttps:\/\/www.diigo.com\/user\/xx7dev\n\nhttps:\/\/beteiligung.hafencity.com\/profile\/xx7dev\/\n\nhttps:\/\/sketchersunited.org\/users\/340534\n\nhttps:\/\/www.bitchute.com\/channel\/TIW9IV0wj7YG\n\nhttps:\/\/start.me\/p\/OwxoOO\/\n\nhttps:\/\/land-book.com\/xx7dev\n\nhttps:\/\/schoolido.lu\/user\/xx7dev\/\n\nhttps:\/\/xtremepape.rs\/members\/xx7dev.701042\/#about\n\nhttps:\/\/fanclove.jp\/profile\/nK20GlXVBo\n\nhttps:\/\/formulamasa.com\/elearning\/members\/xx7dev\/?v=96b62e1dce57\n\nhttps:\/\/camp-fire.jp\/profile\/xx7dev\n\nhttps:\/\/gratisafhalen.be\/author\/xx7dev\/\n\nhttps:\/\/expatguidekorea.com\/profile\/xx7dev\/\n\nhttps:\/\/unityroom.com\/users\/5g30xcbnzumswp6lqj1h\n\nhttps:\/\/www.behance.net\/xx7game1\n\nhttps:\/\/suzuri.jp\/xx7dev\n\nhttps:\/\/jobs.siliconflorist.com\/employers\/4290200-xx7\n\nhttps:\/\/pxhere.com\/en\/photographer-me\/5094152\n\nhttps:\/\/www.miseducationofmotherhood.com\/profile\/xx7dev\/profile\n\nhttps:\/\/zb3.org\/xx7dev\/xx7\n\nhttps:\/\/hackaday.io\/xx7dev\n\nhttps:\/\/leetcode.com\/u\/xx7dev\/\n\nhttps:\/\/old.bitchute.com\/channel\/TIW9IV0wj7YG\/\n\nhttps:\/\/www.heavyironjobs.com\/profiles\/8713623-xx7\n\nhttps:\/\/hanson.net\/users\/xx7dev\n\nhttps:\/\/www.horticulturaljobs.com\/employers\/4290212-xx7\n\nhttps:\/\/forum.aceinna.com\/user\/xx7dev\n\nhttps:\/\/jobs.windomnews.com\/profiles\/8713633-xx7\n\nhttps:\/\/www.checkli.com\/xx7dev#\/a\/process\n\nhttps:\/\/www.wvhired.com\/profiles\/8713641-xx7\n\nhttps:\/\/jobs.host-panel.com\/author\/xx7dev\/\n\nhttps:\/\/vocal.media\/authors\/xx7\n\nhttps:\/\/fliphtml5.com\/home\/xx7dev\n\nhttps:\/\/doc.adminforge.de\/s\/DLIx4SBvRp\n\nhttps:\/\/magic.ly\/xx7dev\n\nhttps:\/\/www.arriba420.com\/profile\/xx7dev\/profile\n\nhttps:\/\/phatwalletforums.com\/user\/xx7dev\n\nhttps:\/\/anunt-imob.ro\/user\/profile\/871578\n\nhttps:\/\/culturesbook.com\/xx7dev\n\nhttps:\/\/www.mapleprimes.com\/users\/xx7dev\n\nhttp:\/\/www.webclap.com\/php\/jump.php?url=https:\/\/xx7.dev\/\n\nhttps:\/\/xx7dev.keepo.bio\/\n\nhttps:\/\/www.lingvolive.com\/en-us\/profile\/5e5c8dfd-fa59-486a-989b-935119129ff4\/translations\n\nhttps:\/\/participation.bordeaux.fr\/profiles\/xx7dev\/activity\n\nhttps:\/\/www.noteflight.com\/profile\/abcdfbcf564f445f7329975848dda36850280155\n\nhttps:\/\/altacucina.co\/profile\/xx7dev\n\nhttps:\/\/tutorialslink.com\/member\/XX7undefined\/113035\n\nhttps:\/\/bioqoo.com\/xx7dev\n\nhttps:\/\/casualgamerevolution.com\/user\/xx7dev\n\nhttps:\/\/pixelfed.uno\/xx7dev\n\nhttps:\/\/www.brownbook.net\/business\/55382289\/xx7\n\nhttps:\/\/musikersuche.musicstore.de\/profil\/xx7dev\/\n\nhttps:\/\/boosty.to\/xx7dev\n\nhttps:\/\/potofu.me\/xx7dev\n\nhttps:\/\/pictureinbottle.com\/r\/xx7dev\n\nhttps:\/\/www.euskalmarket.com\/author\/xx7dev\/\n\nhttps:\/\/divinguniverse.com\/user\/xx7dev\n\nhttps:\/\/fora.babinet.cz\/profile.php?section=personal&id=139212\n\nhttps:\/\/www.jmriascos.space\/profile\/a0110086258584948\/profile\n\nhttps:\/\/www.bat-safe.com\/profile\/a0110086258530327\/profile\n\nhttps:\/\/downforeveryoneorjustme.com\/xx7.dev?proto=https\n\nhttps:\/\/www.mateball.com\/xx7dev\n\nhttps:\/\/www.rcmx.net\/userinfo.php?uid=25533\n\nhttps:\/\/giloo.ist\/member\/xx7dev\/?mainTab=notes&subTab=my_notes\n\nhttps:\/\/mail.protospielsouth.com\/user\/162045\n\nhttp:\/\/forum.orangepi.org\/home.php?mod=space&uid=6831007\n\nhttps:\/\/staroetv.su\/go?https:\/\/xx7.dev\/\n\nhttps:\/\/jump.5ch.io\/?https:\/\/xx7.dev\/\n\nhttps:\/\/findpenguins.com\/4pwfmwxrwnnmh\n\nhttps:\/\/web.luma.com\/user\/xx7dev\n\nhttps:\/\/amazingradio.us\/profile\/xx7dev\n\nhttps:\/\/allmyfaves.com\/xx7dev\n\nhttps:\/\/www.koi-s.id\/member.php?334755-xx7dev\n\nhttps:\/\/www.matrix-digi.com\/forums\/member.php?action=profile&uid=17190\n\nhttps:\/\/notclosed.com\/?URL=https:\/\/xx7.dev\/\n\nhttp:\/\/bbs.sdhuifa.com\/home.php?mod=space&uid=1187792\n\nhttps:\/\/www.squadskates.com\/profile\/a0110086258513729\/profile\n\nhttps:\/\/www.watershedwellness.net\/profile\/a0110086258568589\/profile\n\nhttps:\/\/bike-forum.cz\/profil\/u\/xx7dev\n\nhttps:\/\/files.fm\/xx7dev\/info\n\nhttps:\/\/backloggd.com\/u\/xx7dev\/\n\nhttps:\/\/web.bikemap.net\/u\/xx7dev\n\nhttps:\/\/creator.nightcafe.studio\/u\/xx7dev\n\nhttps:\/\/outdoor.surselva.info\/en\/member\/xx7-game\/348730630\/\n\nhttps:\/\/www.growkudos.com\/profile\/xx7__game\n\nhttps:\/\/www.seymoursimon.com\/?URL=https:\/\/xx7.dev\/\n\nhttps:\/\/www.kwlt.net\/profile\/a0110086258572725\/profile\n\nhttp:\/\/forum.cncprovn.com\/members\/439503-xx7dev\n\nhttps:\/\/www.harimajuku.com\/profile\/a0110086258559967\/profile\n\nhttps:\/\/routinehub.co\/user\/xx7dev","published_at":"2026-08-05T15:27:10.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T15:27:19.000000Z","edited_at":"2026-08-05T15:26:44.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":5,"points":0,"views_count":0,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/eb13f1b1-6c11-41f4-93f7-648098ed5d77.png","user":{"data":{"id":201874,"url":"https:\/\/viblo.asia\/u\/xx7dev","avatar":"3e7eb15a-cc77-4181-8bee-2ba4cc1a268c.jpeg","name":"xxdev","username":"xx7dev","followers_count":0,"reputation":0,"posts_count":0,"banned_at":"2026-08-05T15:27:15.000000Z","level_partner":null,"following":false}},"tags":{"data":[{"slug":"casino","name":"CASino"}]},"commentators":{"data":[]}},{"id":104829,"title":"T\u1ea1i Sao Ch\u1ecdn NextJS Thay V\u00ec WordPress Cho D\u1ef1 \u00c1n Ph\u1ee9c T\u1ea1p (2026)","slug":"R5JRQ3874Gv","url":"https:\/\/viblo.asia\/p\/tai-sao-chon-nextjs-thay-vi-wordpress-cho-du-an-phuc-tap-2026-R5JRQ3874Gv","user_id":201864,"moderation":null,"transliterated":"tai-sao-chon-nextjs-thay-vi-wordpress-cho-du-an-phuc-tap-2026","contents_short":"WordPress hi\u1ec7n chi\u1ebfm h\u01a1n 40% th\u1ecb ph\u1ea7n website to\u00e0n c\u1ea7u \u2014 m\u1ed9t con s\u1ed1 kh\u1ed5ng l\u1ed3. Nh\u01b0ng khi d\u1ef1 \u00e1n c\u1ee7a b\u1ea1n \u0111\u00f2i h\u1ecfi hi\u1ec7u su\u1ea5t cao, b\u1ea3o m\u1eadt nghi\u00eam ng\u1eb7t, v\u00e0 tr\u1ea3i nghi\u1ec7m ng\u01b0\u1eddi d\u00f9ng m\u01b0\u1ee3t m\u00e0, WordPress b\u1eaft \u0111\u1ea7u l\u1ed9 r\u00f5 nh\u1eefng gi\u1edbi h\u1ea1n. \u0110\u00f3 l\u00e0 l\u00fac NextJS \u2014 m\u1ed9t framework React hi\u1ec7n \u0111\u1ea1i \u2014 tr\u1edf th\u00e0nh l\u1ef1a ch\u1ecdn thay th\u1ebf \u0111\u00e1ng c\u00e2n nh\u1eafc.\n\nB\u00e0i vi\u1ebft n\u00e0y kh\u00f4ng nh\u1eb1m \"ch\u00ea WordPress\" hay \"qu\u1ea3ng c\u00e1o NextJS\". M\u1ee5c ti\u00eau l\u00e0 gi\u00fap b...","contents":"**WordPress** hi\u1ec7n chi\u1ebfm h\u01a1n **40% th\u1ecb ph\u1ea7n website to\u00e0n c\u1ea7u** \u2014 m\u1ed9t con s\u1ed1 kh\u1ed5ng l\u1ed3. Nh\u01b0ng khi d\u1ef1 \u00e1n c\u1ee7a b\u1ea1n \u0111\u00f2i h\u1ecfi **hi\u1ec7u su\u1ea5t cao, b\u1ea3o m\u1eadt nghi\u00eam ng\u1eb7t, v\u00e0 tr\u1ea3i nghi\u1ec7m ng\u01b0\u1eddi d\u00f9ng m\u01b0\u1ee3t m\u00e0**, WordPress b\u1eaft \u0111\u1ea7u l\u1ed9 r\u00f5 nh\u1eefng gi\u1edbi h\u1ea1n. \u0110\u00f3 l\u00e0 l\u00fac **NextJS** \u2014 m\u1ed9t framework React hi\u1ec7n \u0111\u1ea1i \u2014 tr\u1edf th\u00e0nh l\u1ef1a ch\u1ecdn thay th\u1ebf \u0111\u00e1ng c\u00e2n nh\u1eafc.\n\nB\u00e0i vi\u1ebft n\u00e0y kh\u00f4ng nh\u1eb1m \"ch\u00ea WordPress\" hay \"qu\u1ea3ng c\u00e1o NextJS\". M\u1ee5c ti\u00eau l\u00e0 gi\u00fap b\u1ea1n **hi\u1ec3u r\u00f5 b\u1ea3n ch\u1ea5t** c\u1ee7a t\u1eebng gi\u1ea3i ph\u00e1p, t\u1eeb \u0111\u00f3 \u0111\u01b0a ra quy\u1ebft \u0111\u1ecbnh \u0111\u00fang \u0111\u1eafn cho d\u1ef1 \u00e1n th\u1ef1c t\u1ebf c\u1ee7a m\u00ecnh.\n\n---\n\n## WordPress ho\u1ea1t \u0111\u1ed9ng nh\u01b0 th\u1ebf n\u00e0o \u2014 v\u00e0 gi\u1edbi h\u1ea1n \u1edf \u0111\u00e2u?\n\n### Ki\u1ebfn tr\u00fac PHP truy\u1ec1n th\u1ed1ng\n\nWordPress ch\u1ea1y tr\u00ean **PHP** \u2014 m\u1ed9t ng\u00f4n ng\u1eef server-side \u0111\u00e3 t\u1ed3n t\u1ea1i h\u01a1n 25 n\u0103m. Khi ng\u01b0\u1eddi d\u00f9ng truy c\u1eadp m\u1ed9t trang WordPress:\n\n1. Server nh\u1eadn request \u2192 ch\u1ea1y PHP \u2192 truy v\u1ea5n MySQL \u2192 t\u1ea1o HTML \u2192 g\u1eedi v\u1ec1 tr\u00ecnh duy\u1ec7t\n2. Tr\u00ecnh duy\u1ec7t hi\u1ec3n th\u1ecb HTML + t\u1ea3i th\u00eam JavaScript cho c\u00e1c t\u01b0\u01a1ng t\u00e1c\n\nQuy tr\u00ecnh n\u00e0y ho\u1ea1t \u0111\u1ed9ng t\u1ed1t cho **n\u1ed9i dung t\u0129nh** v\u00e0 **website quy m\u00f4 nh\u1ecf \u0111\u1ebfn trung b\u00ecnh**. Nh\u01b0ng khi website c\u00f3 h\u00e0ng tr\u0103m trang, h\u00e0ng ngh\u00ecn s\u1ea3n ph\u1ea9m, ho\u1eb7c c\u1ea7n x\u1eed l\u00fd d\u1eef li\u1ec7u th\u1eddi gian th\u1ef1c, **m\u1ed7i request \u0111\u1ec1u ph\u1ea3i ch\u1ea1y l\u1ea1i to\u00e0n b\u1ed9 quy tr\u00ecnh PHP** \u2014 g\u00e2y ch\u1eadm v\u00e0 t\u1ed1n t\u00e0i nguy\u00ean server.\n\n![Ki\u1ebfn tr\u00fac PHP truy\u1ec1n th\u1ed1ng c\u1ee7a WordPress](\/blog-posts\/tai-sao-chon-nextjs-thay-vi-wordpress\/kien-truc-php-truyen-thong-cua-wordpress.jpg)\n\n### C\u00e1c gi\u1edbi h\u1ea1n th\u1ef1c t\u1ebf c\u1ee7a WordPress\n\n**Hi\u1ec7u su\u1ea5t:**\n- M\u1ed7i plugin b\u1ea1n c\u00e0i th\u00eam \u0111\u1ec1u t\u1ea1o th\u00eam query database v\u00e0 load th\u00eam JavaScript\/CSS\n- Theme n\u1eb7ng v\u1edbi nhi\u1ec1u t\u00ednh n\u0103ng kh\u00f4ng c\u1ea7n thi\u1ebft l\u00e0m ch\u1eadm t\u1ed1c \u0111\u1ed9 t\u1ea3i trang\n- Hosting chia s\u1ebb (shared hosting) th\u01b0\u1eddng kh\u00f4ng \u0111\u1ee7 t\u00e0i nguy\u00ean cho website traffic cao\n\n**B\u1ea3o m\u1eadt:**\n- WordPress l\u00e0 m\u00e3 ngu\u1ed3n m\u1edf ph\u1ed5 bi\u1ebfn nh\u1ea5t \u2192 tr\u1edf th\u00e0nh m\u1ee5c ti\u00eau t\u1ea5n c\u00f4ng s\u1ed1 1\n- L\u1ed7 h\u1ed5ng t\u1eeb plugin\/third-party l\u00e0 nguy\u00ean nh\u00e2n c\u1ee7a **h\u1ea7u h\u1ebft c\u00e1c v\u1ee5 hack WordPress**\n- B\u1ea1n ph\u1ea3i t\u1ef1 c\u1eadp nh\u1eadt CMS, plugin, theme li\u00ean t\u1ee5c \u0111\u1ec3 patch l\u1ed7 h\u1ed5ng\n\n**M\u1edf r\u1ed9ng:**\n- Khi c\u1ea7n t\u00ednh n\u0103ng ph\u1ee9c t\u1ea1p (real-time data, API integrations, custom workflows), b\u1ea1n ph\u1ea3i d\u1ef1a v\u00e0o plugin ho\u1eb7c code custom \u2014 c\u1ea3 hai \u0111\u1ec1u\u589e\u52a0\u4e86 \u0111\u1ed9 ph\u1ee9c t\u1ea1p v\u00e0 r\u1ee7i ro\n\n> \u0110\u1ec3 hi\u1ec3u th\u00eam v\u1ec1 WordPress, \u0111\u1ecdc b\u00e0i vi\u1ebft [WordPress l\u00e0 g\u00ec](\/blog\/wordpress-la-gi) ho\u1eb7c [CMS l\u00e0 g\u00ec](\/blog\/cms-la-gi).\n\n---\n\n## NextJS ho\u1ea1t \u0111\u1ed9ng nh\u01b0 th\u1ebf n\u00e0o?\n\n### Ki\u1ebfn tr\u00fac React hi\u1ec7n \u0111\u1ea1i\n\n**NextJS** l\u00e0 m\u1ed9t **framework full-stack** \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng tr\u00ean **React** \u2014 th\u01b0 vi\u1ec7n JavaScript ph\u1ed5 bi\u1ebfn nh\u1ea5t th\u1ebf gi\u1edbi. Kh\u00e1c v\u1edbi WordPress ch\u1ea1y ho\u00e0n to\u00e0n tr\u00ean server, NextJS k\u1ebft h\u1ee3p c\u1ea3 **Server-Side Rendering (SSR)**, **Static Site Generation (SSG)**, v\u00e0 **Client-Side Rendering (CSR)** trong c\u00f9ng m\u1ed9t \u1ee9ng d\u1ee5ng.\n\n![Ki\u1ebfn tr\u00fac NextJS k\u1ebft h\u1ee3p SSR, SSG v\u00e0 CSR](\/blog-posts\/tai-sao-chon-nextjs-thay-vi-wordpress\/kien-truc-nextjs-ket-hop-ssr-ssg-va-csr.jpg)\n\n### Ba ph\u01b0\u01a1ng ph\u00e1p render ch\u00ednh\n\n**1. Static Site Generation (SSG):**\n- HTML \u0111\u01b0\u1ee3c t\u1ea1o s\u1eb5n t\u1ea1i th\u1eddi \u0111i\u1ec3m build\n- Website t\u1ea3i c\u1ef1c nhanh v\u00ec server ch\u1ec9 c\u1ea7n ph\u1ee5c v\u1ee5 file t\u0129nh\n- Ph\u00f9 h\u1ee3p: blog, landing page, documentation, portfolio\n\n**2. Server-Side Rendering (SSR):**\n- HTML \u0111\u01b0\u1ee3c t\u1ea1o m\u1edbi t\u1ea1i m\u1ed7i request tr\u00ean server\n- N\u1ed9i dung lu\u00f4n c\u1eadp nh\u1eadt nh\u01b0ng v\u1eabn t\u1ed1i \u01b0u SEO\n- Ph\u00f9 h\u1ee3p: trang c\u00e1 nh\u00e2n h\u00f3a, dashboard, e-commerce c\u00f3 gi\u00e1 realtime\n\n**3. Client-Side Rendering (CSR):**\n- JavaScript ch\u1ea1y tr\u00ean tr\u00ecnh duy\u1ec7t ng\u01b0\u1eddi d\u00f9ng\n- Ph\u00f9 h\u1ee3p: ph\u1ea7n t\u01b0\u01a1ng t\u00e1c ph\u1ee9c t\u1ea1p sau khi trang \u0111\u00e3 t\u1ea3i\n\n> T\u00ecm hi\u1ec3u chi ti\u1ebft h\u01a1n v\u1ec1 c\u00e1c ph\u01b0\u01a1ng ph\u00e1p render trong b\u00e0i [SEO ReactJS l\u00e0 g\u00ec](\/blog\/seo-reactjs).\n\n---\n\n## So s\u00e1nh chi ti\u1ebft: NextJS vs WordPress\n\n### 1. Hi\u1ec7u su\u1ea5t v\u00e0 t\u1ed1c \u0111\u1ed9 t\u1ea3i trang\n\n| Y\u1ebfu t\u1ed1                   | WordPress                                         | NextJS                                            |\n| ------------------------ | ------------------------------------------------- | ------------------------------------------------- |\n| T\u1ed1c \u0111\u1ed9 t\u1ea3i trang ban \u0111\u1ea7u | Trung b\u00ecnh (ph\u1ee5 thu\u1ed9c v\u00e0o hosting, plugin, theme) | R\u1ea5t nhanh (HTML t\u0129nh ho\u1eb7c SSR t\u1ed1i \u01b0u)             |\n| Core Web Vitals          | Kh\u00f3 t\u1ed1i \u01b0u n\u1ebfu d\u00f9ng nhi\u1ec1u plugin                  | D\u1ec5 \u0111\u1ea1t \u0111i\u1ec3m cao nh\u1edd ki\u1ec3m so\u00e1t ho\u00e0n to\u00e0n rendering |\n| T\u00e0i nguy\u00ean server        | Cao (PHP + MySQL cho m\u1ed7i request)                 | Th\u1ea5p (SSG: file t\u0129nh; SSR: caching th\u00f4ng minh)    |\n| Kh\u1ea3 n\u0103ng CDN             | H\u1ea1n ch\u1ebf (c\u1ea7n plugin nh\u01b0 WP Rocket)                | T\u00edch h\u1ee3p s\u1eb5n (Vercel, Netlify, Cloudflare Pages)  |\n\n\n**Th\u1ef1c t\u1ebf:** M\u1ed9t website WordPress c\u00f3 50 plugin c\u00f3 th\u1ec3 m\u1ea5t **3-5 gi\u00e2y** \u0111\u1ec3 t\u1ea3i trang \u0111\u1ea7u ti\u00ean. C\u00f9ng t\u00ednh n\u0103ng \u0111\u00f3 tr\u00ean NextJS th\u01b0\u1eddng t\u1ea3i trong **d\u01b0\u1edbi 1 gi\u00e2y**.\n\n### 2. SEO\n\n| Y\u1ebfu t\u1ed1 SEO           | WordPress                              | NextJS                                |\n| -------------------- | -------------------------------------- | ------------------------------------- |\n| SSR\/SSG cho SEO      | Kh\u00f4ng m\u1eb7c \u0111\u1ecbnh (c\u1ea7n plugin ho\u1eb7c cache) | M\u1eb7c \u0111\u1ecbnh \u2014 Google crawl HTML \u0111\u1ea7y \u0111\u1ee7   |\n| T\u1ed1c \u0111\u1ed9 \u1ea3nh h\u01b0\u1edfng SEO | Ch\u1eadm n\u1ebfu t\u1ed1i \u01b0u k\u00e9m                    | Nhanh m\u1eb7c \u0111\u1ecbnh \u2014 l\u1ee3i th\u1ebf x\u1ebfp h\u1ea1ng     |\n| Meta tags, Schema    | D\u1ec5 qua plugin (Yoast, Rank Math)       | Code-level ki\u1ec3m so\u00e1t ho\u00e0n to\u00e0n        |\n| URL structure        | T\u00f9y permalinks                         | T\u00f9y \u00fd c\u1ea5u h\u00ecnh qua file-based routing |\n\n\n> \u0110\u1ecdc th\u00eam v\u1ec1 SEO tr\u00ean React trong b\u00e0i [T\u1ed1i \u01b0u SEO cho website ReactJS](\/blog\/seo-reactjs).\n\n### 3. B\u1ea3o m\u1eadt\n\n**WordPress** l\u00e0 m\u1ee5c ti\u00eau t\u1ea5n c\u00f4ng s\u1ed1 1 v\u00ec:\n- M\u00e3 ngu\u1ed3n m\u1edf \u2192 l\u1ed7 h\u1ed5ng \u0111\u01b0\u1ee3c public nhanh ch\u00f3ng\n- Plugin third-party kh\u00f4ng ki\u1ec3m so\u00e1t ch\u1ea5t l\u01b0\u1ee3ng\n- Nhi\u1ec1u website ch\u1ea1y phi\u00ean b\u1ea3n c\u0169, kh\u00f4ng c\u1eadp nh\u1eadt patch\n\n**NextJS** b\u1ea3o m\u1eadt h\u01a1n v\u00ec:\n- Kh\u00f4ng c\u00f3 \"admin panel\" c\u00f4ng khai nh\u01b0 WordPress\n- Kh\u00f4ng ph\u1ee5 thu\u1ed9c v\u00e0o\u7b2c\u4e09\u65b9 plugin ecosystem\n- C\u00f3 th\u1ec3 tri\u1ec3n khai tr\u00ean serverless (Vercel, AWS Lambda) gi\u1ea3m surface attack\n- M\u00e3 ngu\u1ed3n ph\u00eda server kh\u00f4ng expose ra ngo\u00e0i\n\n> T\u00ecm hi\u1ec3u th\u00eam v\u1ec1 [b\u1ea3o m\u1eadt website](\/blog\/bao-mat-website).\n\n### 4. Kh\u1ea3 n\u0103ng m\u1edf r\u1ed9ng\n\n| Y\u1ebfu t\u1ed1             | WordPress                     | NextJS                                                   |\n| ------------------ | ----------------------------- | -------------------------------------------------------- |\n| Th\u00eam t\u00ednh n\u0103ng m\u1edbi | Plugin ho\u1eb7c custom code       | Component-based \u2014 th\u00eam nh\u01b0 Lego                          |\n| X\u1eed l\u00fd data l\u1edbn     | MySQL \u2014 ch\u1eadm v\u1edbi dataset l\u1edbn  | K\u1ebft n\u1ed1i b\u1ea5t k\u1ef3 DB\/API \u2014 PostgreSQL, MongoDB, Firebase... |\n| T\u00edch h\u1ee3p API       | REST API c\u00f3 s\u1eb5n nh\u01b0ng h\u1ea1n ch\u1ebf | API Routes built-in \u2014 REST, GraphQL, tRPC                |\n| Multi-language     | C\u1ea7n plugin (WPML, Polylang)   | next-intl, i18n routing built-in                         |\n\n\n### 5. Chi ph\u00ed tri\u1ec3n khai v\u00e0 v\u1eadn h\u00e0nh\n\n| Chi ph\u00ed                  | WordPress                                    | NextJS                                     |\n| ------------------------ | -------------------------------------------- | ------------------------------------------ |\n| Chi ph\u00ed ban \u0111\u1ea7u          | Th\u1ea5p (3\u201310 tri\u1ec7u)                            | Cao h\u01a1n (10\u201350 tri\u1ec7u t\u00f9y ph\u1ee9c t\u1ea1p)         |\n| Chi ph\u00ed hosting h\u00e0ng n\u0103m | 500K \u2013 5 tri\u1ec7u\/n\u0103m                           | Free tier (Vercel) ho\u1eb7c 500K \u2013 3 tri\u1ec7u\/n\u0103m |\n| Chi ph\u00ed b\u1ea3o tr\u00ec          | Cao (c\u1eadp nh\u1eadt plugin, patch b\u1ea3o m\u1eadt)         | Th\u1ea5p (\u00edt ph\u1ee5 thu\u1ed9c third-party)            |\n| Chi ph\u00ed khi m\u1edf r\u1ed9ng      | T\u0103ng nhanh (plugin premium, upgrade hosting) | D\u1ef1 \u0111o\u00e1n \u0111\u01b0\u1ee3c (scaling theo nhu c\u1ea7u th\u1ef1c)   |\n\n\n> Xem th\u00eam so s\u00e1nh chi ph\u00ed hosting trong b\u00e0i [So s\u00e1nh gi\u00e1 hosting](\/blog\/so-sanh-gia-hosting).\n\n---\n\n## Khi n\u00e0o n\u00ean ch\u1ecdn WordPress?\n\nWordPress v\u1eabn l\u00e0 l\u1ef1a ch\u1ecdn **t\u1ed1t nh\u1ea5t** trong c\u00e1c tr\u01b0\u1eddng h\u1ee3p:\n\n**1. Blog v\u00e0 n\u1ed9i dung c\u00e1 nh\u00e2n:**\n- WordPress \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf cho blogging \u2014 h\u1ec7 th\u1ed1ng qu\u1ea3n l\u00fd b\u00e0i vi\u1ebft, danh m\u1ee5c, tag c\u1ef1c k\u1ef3\u6210\u719f\n- Giao di\u1ec7n qu\u1ea3n tr\u1ecb tr\u1ef1c quan, ai c\u0169ng d\u00f9ng \u0111\u01b0\u1ee3c\n\n**2. Website doanh nghi\u1ec7p nh\u1ecf, gi\u1edbi thi\u1ec7u d\u1ecbch v\u1ee5:**\n- 5-20 trang t\u0129nh, kh\u00f4ng c\u1ea7n t\u00ednh n\u0103ng ph\u1ee9c t\u1ea1p\n- Theme + plugin l\u00e0 \u0111\u1ee7 d\u00f9ng\n\n**3. Ng\u00e2n s\u00e1ch h\u1ea1n ch\u1ebf:**\n- Chi ph\u00ed tri\u1ec3n khai th\u1ea5p nh\u1ea5t c\u00f3 th\u1ec3\n- Nhi\u1ec1u freelancer v\u00e0 agency h\u1ed7 tr\u1ee3 WordPress\n\n**4. \u0110\u1ed9i ng\u0169 kh\u00f4ng c\u00f3 k\u1ef9 thu\u1eadt:**\n- Nh\u00e2n s\u1ef1 marketing, content c\u00f3 th\u1ec3 t\u1ef1 qu\u1ea3n l\u00fd m\u00e0 kh\u00f4ng c\u1ea7n l\u1eadp tr\u00ecnh vi\u00ean\n\n> Xem th\u00eam [h\u01b0\u1edbng d\u1eabn s\u1eed d\u1ee5ng WordPress](\/blog\/huong-dan-su-dung-wordpress) n\u1ebfu b\u1ea1n quy\u1ebft \u0111\u1ecbnh ch\u1ecdn n\u1ec1n t\u1ea3ng n\u00e0y.\n\n---\n\n## Khi n\u00e0o n\u00ean ch\u1ecdn NextJS?\n\nNextJS tr\u1edf th\u00e0nh l\u1ef1a ch\u1ecdn **v\u01b0\u1ee3t tr\u1ed9i** khi:\n\n**1. Hi\u1ec7u su\u1ea5t l\u00e0 y\u00eau c\u1ea7u b\u1eaft bu\u1ed9c:**\n- Website c\u1ea7n t\u1ea3i d\u01b0\u1edbi 2 gi\u00e2y\n- Core Web Vitals ph\u1ea3i \u0111\u1ea1t \u0111i\u1ec3m t\u1ed1i \u0111a\n- L\u01b0\u1ee3ng truy c\u1eadp l\u1edbn (h\u00e0ng tr\u0103m ngh\u00ecn visit\/th\u00e1ng)\n\n**2. D\u1ef1 \u00e1n ph\u1ee9c t\u1ea1p v\u1ec1 t\u00ednh n\u0103ng:**\n- E-commerce v\u1edbi h\u00e0ng ngh\u00ecn s\u1ea3n ph\u1ea9m v\u00e0 b\u1ed9 l\u1ecdc n\u00e2ng cao\n- Dashboard qu\u1ea3n tr\u1ecb v\u1edbi d\u1eef li\u1ec7u th\u1eddi gian th\u1ef1c\n- \u1ee8ng d\u1ee5ng web c\u00f3 t\u00ednh n\u0103ng real-time (chat, notification, live update)\n\n**3. B\u1ea3o m\u1eadt l\u00e0 \u01b0u ti\u00ean:**\n- Website x\u1eed l\u00fd d\u1eef li\u1ec7u nh\u1ea1y c\u1ea3m (t\u00e0i ch\u00ednh, y t\u1ebf, ph\u00e1p l\u00fd)\n- C\u1ea7n ki\u1ec3m so\u00e1t ho\u00e0n to\u00e0n m\u00e3 ngu\u1ed3n ph\u00eda server\n\n**4. D\u1ef1 \u00e1n \u0111a ng\u00f4n ng\u1eef:**\n- Website c\u1ea7n h\u1ed7 tr\u1ee3 2+ ng\u00f4n ng\u1eef v\u1edbi URL ri\u00eang bi\u1ec7t\n- SEO qu\u1ed1c t\u1ebf v\u1edbi hreflang tags ch\u00ednh x\u00e1c\n\n**5. T\u00edch h\u1ee3p h\u1ec7 sinh th\u00e1i b\u00ean ngo\u00e0i:**\n- K\u1ebft n\u1ed1i CRM, ERP, payment gateway, shipping API\n- X\u00e2y d\u1ef1ng micro-frontend ho\u1eb7c modular architecture\n\n> RiverLee s\u1eed d\u1ee5ng NextJS cho ch\u00ednh website n\u00e0y \u2014 xem chi ti\u1ebft t\u1ea1i [d\u1ecbch v\u1ee5 thi\u1ebft k\u1ebf website](\/thiet-ke-website-doanh-nghiep).\n\n---\n\n## Case study th\u1ef1c t\u1ebf: T\u1ea1i sao RiverLee ch\u1ecdn NextJS\n\nWebsite b\u1ea1n \u0111ang \u0111\u1ecdc \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng b\u1eb1ng **NextJS + MDX** \u2014 kh\u00f4ng ph\u1ea3i WordPress. L\u00fd do:\n\n**1. Blog 260+ b\u00e0i vi\u1ebft \u0111a ng\u00f4n ng\u1eef:**\n- 262 b\u00e0i ti\u1ebfng Vi\u1ec7t + 263 b\u00e0i ti\u1ebfng Anh\n- M\u1ed7i b\u00e0i c\u00f3 slug ri\u00eang bi\u1ec7t, \u0111\u01b0\u1ee3c map qua h\u1ec7 th\u1ed1ng `slug-mappings.ts`\n- NextJS x\u1eed l\u00fd routing \u0111a ng\u00f4n ng\u1eef c\u1ef1c k\u1ef3 hi\u1ec7u qu\u1ea3 v\u1edbi `next-intl`\n\n**2. SEO \u0111a qu\u1ed1c gia:**\n- hreflang tags ch\u00ednh x\u00e1c cho t\u1eebng trang\n- Sitemap \u0111\u1ed9ng t\u1ef1 \u0111\u1ed9ng generate cho c\u1ea3 2 ng\u00f4n ng\u1eef\n- Canonical URL r\u00f5 r\u00e0ng, kh\u00f4ng duplicate content\n\n**3. Hi\u1ec7u su\u1ea5t:**\n- Blog d\u00f9ng SSG \u2014 HTML t\u0129nh, t\u1ea3i c\u1ef1c nhanh\n- Core Web Vitals \u0111\u1ec1u \u0111\u1ea1t \u0111i\u1ec3m t\u1ed1i \u0111a\n- Hosting tr\u00ean Vercel \u2014 free tier, kh\u00f4ng t\u1ed1n chi ph\u00ed hosting\n\n**4. M\u1edf r\u1ed9ng:**\n- D\u1ec5 d\u00e0ng th\u00eam ng\u00f4n ng\u1eef m\u1edbi (ch\u1ec9 c\u1ea7n th\u00eam file JSON dictionary)\n- Th\u00eam b\u00e0i vi\u1ebft m\u1edbi ch\u1ec9 c\u1ea7n t\u1ea1o file MDX \u2014 kh\u00f4ng c\u1ea7n ch\u1ea1m v\u00e0o code\n- T\u00edch h\u1ee3p schema markup, structured data d\u1ec5 d\u00e0ng\n\n---\n\n## So s\u00e1nh nhanh: N\u00ean ch\u1ecdn g\u00ec?\n\n| N\u1ebfu b\u1ea1n c\u1ea7n...                      | Ch\u1ecdn WordPress   | Ch\u1ecdn NextJS              |\n| ----------------------------------- | ---------------- | ------------------------ |\n| Blog \u0111\u01a1n gi\u1ea3n, qu\u1ea3n l\u00fd d\u1ec5           | \u2705 Ph\u00f9 h\u1ee3p        | \u2014                        |\n| Website gi\u1edbi thi\u1ec7u doanh nghi\u1ec7p nh\u1ecf | \u2705 Ph\u00f9 h\u1ee3p        | \u2014                        |\n| E-commerce l\u1edbn, hi\u1ec7u su\u1ea5t cao       | \u2014                | \u2705 Ph\u00f9 h\u1ee3p                |\n| Dashboard \/ \u1ee8ng d\u1ee5ng web ph\u1ee9c t\u1ea1p   | \u2014                | \u2705 Ph\u00f9 h\u1ee3p                |\n| Website \u0111a ng\u00f4n ng\u1eef SEO qu\u1ed1c t\u1ebf     | Kh\u00f3 (c\u1ea7n plugin) | \u2705 Ph\u00f9 h\u1ee3p                |\n| B\u1ea3o m\u1eadt nghi\u00eam ng\u1eb7t                 | C\u1ea7n n\u1ed7 l\u1ef1c nhi\u1ec1u | \u2705 Ph\u00f9 h\u1ee3p                |\n| \u0110\u1ed9i ng\u0169 kh\u00f4ng bi\u1ebft code             | \u2705 Ph\u00f9 h\u1ee3p        | C\u1ea7n developer            |\n| Ng\u00e2n s\u00e1ch d\u01b0\u1edbi 10 tri\u1ec7u             | \u2705 Ph\u00f9 h\u1ee3p        | Kh\u00f3 (c\u1ea7n \u0111\u1ea7u t\u01b0 ban \u0111\u1ea7u) |\n\n\n---\n\n## K\u1ebft lu\u1eadn\n\n**WordPress** v\u1eabn l\u00e0 n\u1ec1n t\u1ea3ng tuy\u1ec7t v\u1eddi cho blog, website doanh nghi\u1ec7p nh\u1ecf, v\u00e0 c\u00e1c d\u1ef1 \u00e1n c\u00f3 ng\u00e2n s\u00e1ch h\u1ea1n ch\u1ebf. \u0110\u1eebng v\u1ed9i \"b\u1ecf WordPress\" ch\u1ec9 v\u00ec nghe n\u00f3i NextJS t\u1ed1t h\u01a1n.\n\n**NextJS** tr\u1edf n\u00ean v\u01b0\u1ee3t tr\u1ed9i khi d\u1ef1 \u00e1n \u0111\u00f2i h\u1ecfi **hi\u1ec7u su\u1ea5t cao, b\u1ea3o m\u1eadt nghi\u00eam ng\u1eb7t, t\u00ednh n\u0103ng ph\u1ee9c t\u1ea1p, v\u00e0 m\u1edf r\u1ed9ng d\u00e0i h\u1ea1n**. N\u1ebfu b\u1ea1n \u0111ang x\u00e2y d\u1ef1ng m\u1ed9t s\u1ea3n ph\u1ea9m digital nghi\u00eam t\u00fac \u2014 \u0111\u1eb7c bi\u1ec7t l\u00e0 e-commerce l\u1edbn, SaaS, ho\u1eb7c portal \u0111a ng\u00f4n ng\u1eef \u2014 NextJS l\u00e0 l\u1ef1a ch\u1ecdn chi\u1ebfn l\u01b0\u1ee3c.\n\nQuan tr\u1ecdng nh\u1ea5t: **\u0111\u1eebng ch\u1ecdn c\u00f4ng c\u1ee5 ch\u1ec9 v\u00ec xu h\u01b0\u1edbng**. H\u00e3y ch\u1ecdn c\u00e1i g\u00ec ph\u00f9 h\u1ee3p v\u1edbi ** y\u00eau c\u1ea7u th\u1ef1c t\u1ebf, ng\u00e2n s\u00e1ch, v\u00e0 n\u0103ng l\u1ef1c \u0111\u1ed9i ng\u0169** c\u1ee7a b\u1ea1n.\n\n> N\u1ebfu b\u1ea1n c\u1ea7n t\u01b0 v\u1ea5n th\u00eam v\u1ec1 vi\u1ec7c l\u1ef1a ch\u1ecdn n\u1ec1n t\u1ea3ng ph\u00f9 h\u1ee3p, li\u00ean h\u1ec7 [RiverLee](\/lien-he) \u2014 ch\u00fang t\u00f4i c\u00f3 kinh nghi\u1ec7m tri\u1ec3n khai c\u1ea3 WordPress v\u00e0 NextJS cho nhi\u1ec1u d\u1ef1 \u00e1n th\u1ef1c t\u1ebf.","published_at":"2026-08-05T14:22:36.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T17:00:25.000000Z","edited_at":"2026-08-05T14:24:35.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":9,"points":0,"views_count":11,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/c65f93c2-4960-4e5e-a14f-6a2d510a5bd5.jpg","user":{"data":{"id":201864,"url":"https:\/\/viblo.asia\/u\/riverlee_web_design","avatar":"c6d00535-b8bb-45c0-afdf-f16ddb69aea0.png","name":"Thi\u1ebft k\u1ebf Website RiverLee","username":"riverlee_web_design","followers_count":0,"reputation":0,"posts_count":1,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"nextjs","name":"nextjs"},{"slug":"wordpress","name":"Wordpress"},{"slug":"web-design","name":"Web Design"},{"slug":"tech-stack","name":"tech stack"}]},"commentators":{"data":[]}},{"id":104824,"title":"Lab 8.5 - Thi\u1ebft l\u1eadp Alerting v\u1edbi Prometheus v\u00e0 Alertmanager","slug":"QyJKz8O54Me","url":"https:\/\/viblo.asia\/p\/lab-85-thiet-lap-alerting-voi-prometheus-va-alertmanager-QyJKz8O54Me","user_id":98940,"moderation":null,"transliterated":"lab-85-thiet-lap-alerting-voi-prometheus-va-alertmanager","contents_short":"Ph\u1ea7n 7 - Debug Alerting v\u00e0 Best Practices trong Production\n\nSau ph\u1ea7n 6, ch\u00fang ta \u0111\u00e3 ki\u1ec3m th\u1eed th\u00e0nh c\u00f4ng to\u00e0n b\u1ed9 v\u00f2ng \u0111\u1eddi c\u1ee7a Alert:\n\nCh\u00fang ta \u0111\u00e3 t\u1ea1o ra c\u00e1c t\u00ecnh hu\u1ed1ng th\u1ef1c t\u1ebf:\n\n* Backend b\u1ecb down.\n* API tr\u1ea3 v\u1ec1 HTTP 500.\n* Pod restart li\u00ean t\u1ee5c.\n* CPU t\u0103ng cao.\n\nTuy nhi\u00ean, trong m\u00f4i tr\u01b0\u1eddng Production, vi\u1ec7c t\u1ea1o \u0111\u01b0\u1ee3c Alert ch\u01b0a \u0111\u1ee7.\n\nM\u1ed9t h\u1ec7 th\u1ed1ng Alert t\u1ed1t c\u1ea7n \u0111\u1ea3m b\u1ea3o:\n\n* Alert \u0111\u00fang v\u1ea5n \u0111\u1ec1.\n* Alert \u0111...","contents":"# Ph\u1ea7n 7 - Debug Alerting v\u00e0 Best Practices trong Production\n\nSau ph\u1ea7n 6, ch\u00fang ta \u0111\u00e3 ki\u1ec3m th\u1eed th\u00e0nh c\u00f4ng to\u00e0n b\u1ed9 v\u00f2ng \u0111\u1eddi c\u1ee7a Alert:\n\n```text\nInactive\n\n    \u2193\n\nPending\n\n    \u2193\n\nFiring\n\n    \u2193\n\nResolved\n```\n\nCh\u00fang ta \u0111\u00e3 t\u1ea1o ra c\u00e1c t\u00ecnh hu\u1ed1ng th\u1ef1c t\u1ebf:\n\n* Backend b\u1ecb down.\n* API tr\u1ea3 v\u1ec1 HTTP 500.\n* Pod restart li\u00ean t\u1ee5c.\n* CPU t\u0103ng cao.\n\nTuy nhi\u00ean, trong m\u00f4i tr\u01b0\u1eddng Production, vi\u1ec7c **t\u1ea1o \u0111\u01b0\u1ee3c Alert ch\u01b0a \u0111\u1ee7**.\n\nM\u1ed9t h\u1ec7 th\u1ed1ng Alert t\u1ed1t c\u1ea7n \u0111\u1ea3m b\u1ea3o:\n\n* Alert \u0111\u00fang v\u1ea5n \u0111\u1ec1.\n* Alert \u0111\u00fang th\u1eddi \u0111i\u1ec3m.\n* Alert g\u1eedi t\u1edbi \u0111\u00fang ng\u01b0\u1eddi.\n* Kh\u00f4ng t\u1ea1o qu\u00e1 nhi\u1ec1u c\u1ea3nh b\u00e1o g\u00e2y nhi\u1ec5u.\n\nN\u1ebfu thi\u1ebft k\u1ebf Alert kh\u00f4ng t\u1ed1t, DevOps c\u00f3 th\u1ec3 r\u01a1i v\u00e0o t\u00ecnh tr\u1ea1ng:\n\n```text\n1000 Alerts \/ ng\u00e0y\n\n\u2193\n\nKh\u00f4ng ai \u0111\u1ecdc Alert n\u1eefa\n\n\u2193\n\nB\u1ecf qua c\u1ea3 Alert quan tr\u1ecdng\n```\n\nHi\u1ec7n t\u01b0\u1ee3ng n\u00e0y g\u1ecdi l\u00e0:\n\n# Alert Fatigue\n\n---\n\n# 1. Alert Fatigue l\u00e0 g\u00ec?\n\nAlert Fatigue (m\u1ec7t m\u1ecfi v\u00ec c\u1ea3nh b\u00e1o) x\u1ea3y ra khi h\u1ec7 th\u1ed1ng g\u1eedi qu\u00e1 nhi\u1ec1u c\u1ea3nh b\u00e1o kh\u00f4ng c\u1ea7n thi\u1ebft.\n\nV\u00ed d\u1ee5:\n\nM\u1ed7i ng\u00e0y nh\u1eadn:\n\n```\nCPU Warning\nCPU Warning\nCPU Warning\nMemory Warning\nMemory Warning\nPod Restart\nCPU Warning\n```\n\nSau m\u1ed9t th\u1eddi gian:\n\nDevOps s\u1ebd c\u00f3 xu h\u01b0\u1edbng:\n\n* Ignore Email.\n* T\u1eaft Notification.\n* Kh\u00f4ng ki\u1ec3m tra Alert n\u1eefa.\n\nK\u1ebft qu\u1ea3:\n\nM\u1ed9t s\u1ef1 c\u1ed1 th\u1eadt s\u1ef1 x\u1ea3y ra nh\u01b0ng kh\u00f4ng ai ph\u1ea3n \u1ee9ng.\n\n---\n\n# Nguy\u00ean t\u1eafc t\u1ea1o Alert\n\nM\u1ed9t Alert t\u1ed1t ph\u1ea3i tr\u1ea3 l\u1eddi \u0111\u01b0\u1ee3c c\u00e2u h\u1ecfi:\n\n> \"N\u1ebfu Alert n\u00e0y x\u1ea3y ra, t\u00f4i c\u00f3 c\u1ea7n h\u00e0nh \u0111\u1ed9ng ngay kh\u00f4ng?\"\n\nN\u1ebfu c\u00e2u tr\u1ea3 l\u1eddi l\u00e0:\n\n```\nKh\u00f4ng\n```\n\nth\u00ec c\u00f3 th\u1ec3 Alert \u0111\u00f3 kh\u00f4ng c\u1ea7n t\u1ed3n t\u1ea1i.\n\n---\n\n# 2. Alert n\u00e0o n\u00ean t\u1ea1o trong Production?\n\nKh\u00f4ng ph\u1ea3i m\u1ecdi Metric \u0111\u1ec1u c\u1ea7n Alert.\n\nV\u00ed d\u1ee5:\n\nGrafana c\u00f3 th\u1ec3 hi\u1ec3n th\u1ecb:\n\n* CPU.\n* Memory.\n* Disk.\n* Network.\n\nNh\u01b0ng kh\u00f4ng nh\u1ea5t thi\u1ebft t\u1ea5t c\u1ea3 \u0111\u1ec1u c\u1ea7n Alert.\n\n---\n\n# Nh\u00f3m 1: Availability Alert\n\n\u0110\u00e2y l\u00e0 nh\u00f3m Alert quan tr\u1ecdng nh\u1ea5t.\n\nM\u1ee5c ti\u00eau:\n\nPh\u00e1t hi\u1ec7n h\u1ec7 th\u1ed1ng kh\u00f4ng ph\u1ee5c v\u1ee5 \u0111\u01b0\u1ee3c ng\u01b0\u1eddi d\u00f9ng.\n\n---\n\n## Application Down\n\nV\u00ed d\u1ee5:\n\n```promql\nup{job=\"todo-api\"} == 0\n```\n\n\u00dd ngh\u0129a:\n\nPrometheus kh\u00f4ng scrape \u0111\u01b0\u1ee3c \u1ee9ng d\u1ee5ng.\n\nAlert:\n\n```yaml\nalert: TodoApiDown\n\nseverity: critical\n```\n\n\u0110\u00e2y l\u00e0 Alert c\u1ea7n ph\u1ea3n \u1ee9ng ngay.\n\n---\n\n## Kubernetes Pod Down\n\nV\u00ed d\u1ee5:\n\n```promql\nkube_pod_status_phase{\nphase=\"Failed\"\n}\n```\n\nPh\u00e1t hi\u1ec7n:\n\n* Pod Failed.\n* Container crash.\n\n---\n\n# Nh\u00f3m 2: Error Rate Alert\n\nKh\u00f4ng ph\u1ea3i l\u00fac n\u00e0o \u1ee9ng d\u1ee5ng Down m\u1edbi l\u00e0 l\u1ed7i.\n\nM\u1ed9t \u1ee9ng d\u1ee5ng c\u00f3 th\u1ec3:\n\n```\nPod Running\n\nService Running\n\nContainer Running\n```\n\nnh\u01b0ng:\n\n```\n90% request tr\u1ea3 v\u1ec1 HTTP 500\n```\n\nNg\u01b0\u1eddi d\u00f9ng v\u1eabn kh\u00f4ng s\u1eed d\u1ee5ng \u0111\u01b0\u1ee3c.\n\n---\n\nV\u00ed d\u1ee5:\n\n```promql\nrate(\nhttp_server_requests_seconds_count{\nstatus=~\"5..\"\n}[5m]\n)\n```\n\nAlert:\n\n```yaml\nalert: HighHTTP5xxRate\n\nseverity: critical\n```\n\n---\n\n# Nh\u00f3m 3: Latency Alert\n\nNg\u01b0\u1eddi d\u00f9ng th\u01b0\u1eddng c\u1ea3m nh\u1eadn v\u1ea5n \u0111\u1ec1 qua t\u1ed1c \u0111\u1ed9 ph\u1ea3n h\u1ed3i.\n\nV\u00ed d\u1ee5:\n\nB\u00ecnh th\u01b0\u1eddng:\n\n```\n50ms\n```\n\nSau s\u1ef1 c\u1ed1:\n\n```\n3000ms\n```\n\n\u1ee8ng d\u1ee5ng v\u1eabn:\n\n```\nRunning\n```\n\nnh\u01b0ng tr\u1ea3i nghi\u1ec7m ng\u01b0\u1eddi d\u00f9ng r\u1ea5t t\u1ec7.\n\n---\n\nV\u00ed d\u1ee5:\n\n```promql\n(\nrate(\nhttp_server_requests_seconds_sum[5m]\n)\n\/\nrate(\nhttp_server_requests_seconds_count[5m]\n)\n)\n> 1\n```\n\n\u00dd ngh\u0129a:\n\nLatency trung b\u00ecnh:\n\n```\n> 1 gi\u00e2y\n```\n\n---\n\n# Nh\u00f3m 4: Resource Alert\n\n## CPU\n\nCPU cao li\u00ean t\u1ee5c c\u00f3 th\u1ec3 g\u00e2y:\n\n* Response ch\u1eadm.\n* Request timeout.\n* HPA scale.\n\nV\u00ed d\u1ee5:\n\n```text\nCPU > 90%\n\ntrong 10 ph\u00fat\n```\n\n---\n\n## Memory\n\nMemory nguy hi\u1ec3m h\u01a1n CPU.\n\nN\u1ebfu v\u01b0\u1ee3t gi\u1edbi h\u1ea1n:\n\n```\nOOMKilled\n```\n\nPod b\u1ecb Kubernetes kill.\n\nV\u00ed d\u1ee5:\n\n```text\nMemory > 90%\n\ntrong 5 ph\u00fat\n```\n\n---\n\n# Nh\u00f3m 5: Kubernetes Stability Alert\n\nM\u1ed9t h\u1ec7 th\u1ed1ng Production c\u1ea7n theo d\u00f5i s\u1ef1 \u1ed5n \u0111\u1ecbnh c\u1ee7a Pod.\n\n---\n\n## Pod Restart\n\nV\u00ed d\u1ee5:\n\n```promql\nincrease(\nkube_pod_container_status_restarts_total[10m]\n)\n> 5\n```\n\nPh\u00e1t hi\u1ec7n:\n\n* CrashLoopBackOff.\n* Exception.\n* Configuration Error.\n\n---\n\n## Pending Pod\n\nV\u00ed d\u1ee5:\n\n```promql\nkube_pod_status_phase{\nphase=\"Pending\"\n}\n```\n\nNguy\u00ean nh\u00e2n:\n\n* Thi\u1ebfu CPU.\n* Thi\u1ebfu Memory.\n* Node l\u1ed7i.\n\n---\n\n# 3. Severity trong Alert\n\nKh\u00f4ng ph\u1ea3i Alert n\u00e0o c\u0169ng quan tr\u1ecdng nh\u01b0 nhau.\n\nTh\u00f4ng th\u01b0\u1eddng chia th\u00e0nh:\n\n```\nCritical\n\nWarning\n\nInfo\n```\n\n---\n\n# Critical\n\nC\u1ea7n x\u1eed l\u00fd ngay.\n\nV\u00ed d\u1ee5:\n\n```yaml\nseverity: critical\n```\n\nV\u00ed d\u1ee5:\n\n* API Down.\n* Database Down.\n* HTTP 500 t\u0103ng m\u1ea1nh.\n\nNotification:\n\n```\nEmail\n\nSlack\n\nPagerDuty\n```\n\n---\n\n# Warning\n\nC\u1ea7n theo d\u00f5i.\n\nV\u00ed d\u1ee5:\n\n```yaml\nseverity: warning\n```\n\nV\u00ed d\u1ee5:\n\n* CPU 80%.\n* Memory 85%.\n* Latency t\u0103ng nh\u1eb9.\n\nNotification:\n\n```\nSlack\n```\n\n---\n\n# Info\n\nCh\u1ec9 mang t\u00ednh th\u00f4ng b\u00e1o.\n\nV\u00ed d\u1ee5:\n\n```\nDeployment completed\n```\n\nKh\u00f4ng c\u1ea7n g\u1eedi Notification.\n\n---\n\n# 4. S\u1eed d\u1ee5ng Labels \u0111\u1ec3 ph\u00e2n lo\u1ea1i Alert\n\nV\u00ed d\u1ee5:\n\n```yaml\nlabels:\n\n  severity: critical\n\n  team: backend\n\n  service: todo-api\n```\n\nKhi Alert g\u1eedi t\u1edbi Alertmanager:\n\nTh\u00f4ng tin n\u00e0y \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 routing.\n\nV\u00ed d\u1ee5:\n\n```\nteam=backend\n\n        \u2193\n\nBackend Team nh\u1eadn\n```\n\n---\n\n# 5. Routing Alert trong Alertmanager\n\nTrong Production th\u01b0\u1eddng c\u00f3 nhi\u1ec1u team:\n\n```\nBackend Team\n\nFrontend Team\n\nDatabase Team\n\nInfrastructure Team\n```\n\nKh\u00f4ng n\u00ean g\u1eedi t\u1ea5t c\u1ea3 Alert cho m\u1ecdi ng\u01b0\u1eddi.\n\nV\u00ed d\u1ee5:\n\n```yaml\nroute:\n\n  routes:\n\n  - match:\n\n      team: backend\n\n    receiver: backend-slack\n\n\n  - match:\n\n      team: database\n\n    receiver: database-slack\n```\n\n---\n\nK\u1ebft qu\u1ea3:\n\n```\nTodo API Error\n\n        \u2193\n\nBackend Team\n\n\nPostgreSQL Down\n\n        \u2193\n\nDatabase Team\n```\n\n---\n\n# 6. Tr\u00e1nh Alert d\u1ef1a tr\u00ean m\u1ed9t Metric \u0111\u01a1n l\u1ebb\n\nM\u1ed9t l\u1ed7i ph\u1ed5 bi\u1ebfn:\n\nT\u1ea1o Alert:\n\n```text\nCPU > 80%\n```\n\nNgay l\u1eadp t\u1ee9c.\n\nV\u1ea5n \u0111\u1ec1:\n\nM\u1ed9t h\u1ec7 th\u1ed1ng c\u00f3 th\u1ec3 b\u00ecnh th\u01b0\u1eddng khi CPU t\u0103ng trong th\u1eddi gian ng\u1eafn.\n\nV\u00ed d\u1ee5:\n\n```\nDeploy Application\n\n        \u2193\n\nCPU 95%\n\n        \u2193\n\n30 gi\u00e2y\n\n        \u2193\n\nCPU b\u00ecnh th\u01b0\u1eddng\n```\n\nKh\u00f4ng c\u1ea7n Alert.\n\n---\n\nN\u00ean d\u00f9ng:\n\n```yaml\nfor: 10m\n```\n\nV\u00ed d\u1ee5:\n\n```text\nCPU > 90%\n\nli\u00ean t\u1ee5c 10 ph\u00fat\n```\n\n---\n\n# 7. S\u1eed d\u1ee5ng Multi-condition Alert\n\nAlert t\u1ed1t th\u01b0\u1eddng k\u1ebft h\u1ee3p nhi\u1ec1u \u0111i\u1ec1u ki\u1ec7n.\n\nV\u00ed d\u1ee5:\n\nCPU cao + Request t\u0103ng:\n\n```\nCPU > 90%\n\nAND\n\nRequest Rate > 1000 req\/s\n```\n\n\u0110i\u1ec1u n\u00e0y ch\u00ednh x\u00e1c h\u01a1n.\n\n---\n\n# 8. Kh\u00f4ng Alert m\u1ecdi th\u1ee9\n\nM\u1ed9t s\u1ed1 Metric ch\u1ec9 n\u00ean xem tr\u00ean Grafana.\n\nV\u00ed d\u1ee5:\n\nKh\u00f4ng n\u00ean Alert:\n\n```\nCPU t\u0103ng 60%\n\nDisk I\/O t\u0103ng nh\u1eb9\n\nThread t\u0103ng 10%\n```\n\nV\u00ec \u0111\u00e2y ch\u1ec9 l\u00e0 th\u00f4ng tin quan s\u00e1t.\n\n---\n\nN\u00ean Alert:\n\n```\nUser Impact\n\nSystem Failure\n\nData Loss Risk\n```\n\n---\n\n# 9. Checklist Debug khi Alert kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng\n\nKhi Alert kh\u00f4ng ch\u1ea1y, ki\u1ec3m tra theo th\u1ee9 t\u1ef1.\n\n---\n\n## B\u01b0\u1edbc 1: Prometheus c\u00f3 Metric kh\u00f4ng?\n\nV\u00ed d\u1ee5:\n\n```promql\nup{job=\"todo-api\"}\n```\n\nN\u1ebfu kh\u00f4ng c\u00f3 d\u1eef li\u1ec7u:\n\nKi\u1ec3m tra:\n\n* Service.\n* Endpoint.\n* Scrape Config.\n\n---\n\n## B\u01b0\u1edbc 2: Prometheus c\u00f3 Load Rule kh\u00f4ng?\n\nV\u00e0o:\n\n```\nPrometheus\n\n\u2193\n\nStatus\n\n\u2193\n\nRules\n```\n\nPh\u1ea3i th\u1ea5y:\n\n```\ntodo-alerts\n```\n\n---\n\n## B\u01b0\u1edbc 3: Test PromQL\n\nCopy bi\u1ec3u th\u1ee9c Alert v\u00e0o Query.\n\nV\u00ed d\u1ee5:\n\n```promql\nup{job=\"todo-api\"} == 0\n```\n\nN\u1ebfu kh\u00f4ng c\u00f3 k\u1ebft qu\u1ea3:\n\nAlert kh\u00f4ng th\u1ec3 ch\u1ea1y.\n\n---\n\n## B\u01b0\u1edbc 4: Ki\u1ec3m tra Alertmanager\n\nPrometheus:\n\n```\nStatus\n\n\u2193\n\nRuntime & Build Information\n```\n\nKi\u1ec3m tra:\n\n```\nAlertmanagers\n```\n\n---\n\n## B\u01b0\u1edbc 5: Ki\u1ec3m tra Alertmanager Log\n\n```bash\nkubectl logs \\\nprometheus-alertmanager-0 \\\n-n monitoring\n```\n\n---\n\n# 10. Production Alert Checklist\n\nM\u1ed9t h\u1ec7 th\u1ed1ng Kubernetes Production n\u00ean c\u00f3 t\u1ed1i thi\u1ec3u:\n\n| Alert               | M\u1ee9c \u0111\u1ed9   |\n| ------------------- | -------- |\n| Application Down    | Critical |\n| HTTP 5xx t\u0103ng cao   | Critical |\n| Database Down       | Critical |\n| Pod Restart         | Warning  |\n| Pod Pending         | Warning  |\n| Memory g\u1ea7n gi\u1edbi h\u1ea1n | Warning  |\n| CPU cao k\u00e9o d\u00e0i     | Warning  |\n| Node Down           | Critical |\n| Disk \u0111\u1ea7y            | Critical |\n| Certificate h\u1ebft h\u1ea1n | Warning  |\n\n---\n\n# 11. T\u1ed5ng k\u1ebft Lab 8\n\nSau to\u00e0n b\u1ed9 Lab 8, ch\u00fang ta \u0111\u00e3 x\u00e2y d\u1ef1ng \u0111\u01b0\u1ee3c h\u1ec7 th\u1ed1ng Alerting ho\u00e0n ch\u1ec9nh:\n\n```text\n                 Kubernetes\n\n                      |\n\n                      \u25bc\n\n               Export Metrics\n\n                      |\n\n                      \u25bc\n\n                Prometheus\n\n                      |\n\n              Evaluate Rules\n\n                      |\n\n                      \u25bc\n\n              Alertmanager\n\n              \/          \\\n\n             \/            \\\n\n        Email            Slack\n\n             \\            \/\n\n              \\          \/\n\n                DevOps Team\n```\n\nB\u1ea1n \u0111\u00e3 hi\u1ec3u:\n\n\u2705 Alert Rule\n\u2705 PromQL Alert Expression\n\u2705 Alert Lifecycle\n\u2705 Pending\n\u2705 Firing\n\u2705 Resolved\n\u2705 Alertmanager\n\u2705 Email Notification\n\u2705 Slack Notification\n\u2705 Severity\n\u2705 Routing\n\u2705 Alert Best Practices\n\n---\n\n# B\u00e0i h\u1ecdc r\u00fat ra\n\nMonitoring tr\u1ea3 l\u1eddi c\u00e2u h\u1ecfi:\n\n> \"\u0110i\u1ec1u g\u00ec \u0111ang x\u1ea3y ra v\u1edbi h\u1ec7 th\u1ed1ng?\"\n\nAlerting tr\u1ea3 l\u1eddi c\u00e2u h\u1ecfi:\n\n> \"Khi n\u00e0o ch\u00fang ta c\u1ea7n h\u00e0nh \u0111\u1ed9ng?\"\n\nM\u1ed9t h\u1ec7 th\u1ed1ng Production t\u1ed1t kh\u00f4ng ch\u1ec9 c\u1ea7n Dashboard \u0111\u1eb9p.\n\nN\u00f3 c\u1ea7n kh\u1ea3 n\u0103ng:\n\n* T\u1ef1 ph\u00e1t hi\u1ec7n s\u1ef1 c\u1ed1.\n* Th\u00f4ng b\u00e1o \u0111\u00fang ng\u01b0\u1eddi.\n* Gi\u1ea3m th\u1eddi gian ph\u1ea3n \u1ee9ng.\n* Gi\u00fap DevOps x\u1eed l\u00fd v\u1ea5n \u0111\u1ec1 tr\u01b0\u1edbc khi ng\u01b0\u1eddi d\u00f9ng b\u1ecb \u1ea3nh h\u01b0\u1edfng.\n\n---\n\n# Chu\u1ea9n b\u1ecb cho Lab 9\n\n\u1ede Lab 9, ch\u00fang ta s\u1ebd ho\u00e0n thi\u1ec7n b\u1ed9 ba Observability:\n\n```text\nMetrics\n\n+\n\nAlerting\n\n+\n\nLogging\n```\n\nCh\u00fang ta s\u1ebd tri\u1ec3n khai:\n\n* Centralized Logging.\n* Thu th\u1eadp log t\u1eeb Kubernetes Pod.\n* Loki.\n* Promtail.\n* Grafana Logs Explorer.\n\nKhi \u0111\u00f3 DevOps c\u00f3 th\u1ec3 \u0111i theo to\u00e0n b\u1ed9 quy tr\u00ecnh x\u1eed l\u00fd s\u1ef1 c\u1ed1:\n\n```\nAlert nh\u1eadn \u0111\u01b0\u1ee3c\n\n\u2193\n\nXem Metrics\n\n\u2193\n\nX\u00e1c \u0111\u1ecbnh v\u1ea5n \u0111\u1ec1\n\n\u2193\n\nXem Logs\n\n\u2193\n\nT\u00ecm nguy\u00ean nh\u00e2n g\u1ed1c\n```\n\n\u0110\u00e2y ch\u00ednh l\u00e0 quy tr\u00ecnh v\u1eadn h\u00e0nh m\u1ed9t h\u1ec7 th\u1ed1ng Kubernetes Production th\u1ef1c t\u1ebf.","published_at":"2026-08-05T11:39:13.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T19:00:06.000000Z","edited_at":"2026-08-05T11:38:50.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":6,"points":0,"views_count":12,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/321a7689-c9ea-4d42-b8a4-92cb6e41d31c.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":59,"reputation":1181,"posts_count":100,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"alerting","name":"Alerting"},{"slug":"alertmanager","name":"alertmanager"},{"slug":"prometheus","name":"Prometheus"}]},"commentators":{"data":[]}},{"id":104823,"title":"Lab 8.4 - Thi\u1ebft l\u1eadp Alerting v\u1edbi Prometheus v\u00e0 Alertmanager","slug":"2vJPdbXMJeK","url":"https:\/\/viblo.asia\/p\/lab-84-thiet-lap-alerting-voi-prometheus-va-alertmanager-2vJPdbXMJeK","user_id":98940,"moderation":null,"transliterated":"lab-84-thiet-lap-alerting-voi-prometheus-va-alertmanager","contents_short":"Ph\u1ea7n 6 - Ki\u1ec3m th\u1eed Alert trong th\u1ef1c t\u1ebf (Pending \u2192 Firing \u2192 Resolved)\n\n\u1ede c\u00e1c ph\u1ea7n tr\u01b0\u1edbc, ch\u00fang ta \u0111\u00e3 ho\u00e0n th\u00e0nh vi\u1ec7c x\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng Alerting:\n\n* Prometheus thu th\u1eadp Metrics.\n* Alert Rule \u0111\u01b0\u1ee3c c\u1ea5u h\u00ecnh.\n* Prometheus \u0111\u00e1nh gi\u00e1 \u0111i\u1ec1u ki\u1ec7n Alert.\n* Alertmanager nh\u1eadn Alert.\n* Alertmanager c\u00f3 th\u1ec3 g\u1eedi Email\/Slack.\n\nTuy nhi\u00ean, m\u1ed9t h\u1ec7 th\u1ed1ng Alerting ch\u1ec9 th\u1ef1c s\u1ef1 c\u00f3 gi\u00e1 tr\u1ecb khi ch\u00fang ta bi\u1ebft n\u00f3 ho\u1ea1t \u0111\u1ed9ng t...","contents":"# Ph\u1ea7n 6 - Ki\u1ec3m th\u1eed Alert trong th\u1ef1c t\u1ebf (Pending \u2192 Firing \u2192 Resolved)\n\n\u1ede c\u00e1c ph\u1ea7n tr\u01b0\u1edbc, ch\u00fang ta \u0111\u00e3 ho\u00e0n th\u00e0nh vi\u1ec7c x\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng Alerting:\n\n* Prometheus thu th\u1eadp Metrics.\n* Alert Rule \u0111\u01b0\u1ee3c c\u1ea5u h\u00ecnh.\n* Prometheus \u0111\u00e1nh gi\u00e1 \u0111i\u1ec1u ki\u1ec7n Alert.\n* Alertmanager nh\u1eadn Alert.\n* Alertmanager c\u00f3 th\u1ec3 g\u1eedi Email\/Slack.\n\nTuy nhi\u00ean, m\u1ed9t h\u1ec7 th\u1ed1ng Alerting ch\u1ec9 th\u1ef1c s\u1ef1 c\u00f3 gi\u00e1 tr\u1ecb khi ch\u00fang ta bi\u1ebft n\u00f3 ho\u1ea1t \u0111\u1ed9ng trong t\u00ecnh hu\u1ed1ng th\u1ef1c t\u1ebf.\n\nTrong ph\u1ea7n n\u00e0y, ch\u00fang ta s\u1ebd t\u1ea1o ra c\u00e1c s\u1ef1 c\u1ed1 gi\u1ea3 l\u1eadp tr\u00ean h\u1ec7 th\u1ed1ng Todo v\u00e0 quan s\u00e1t to\u00e0n b\u1ed9 v\u00f2ng \u0111\u1eddi c\u1ee7a m\u1ed9t Alert:\n\n```text\nInactive\n\n    \u2193\n\nPending\n\n    \u2193\n\nFiring\n\n    \u2193\n\nResolved\n```\n\n---\n\n# M\u1ee5c ti\u00eau\n\nSau ph\u1ea7n n\u00e0y, b\u1ea1n s\u1ebd hi\u1ec3u:\n\n* C\u00e1ch ki\u1ec3m tra Alert Rule c\u00f3 ho\u1ea1t \u0111\u1ed9ng hay kh\u00f4ng.\n* S\u1ef1 kh\u00e1c nhau gi\u1eefa Pending v\u00e0 Firing.\n* C\u00e1ch Prometheus g\u1eedi Alert sang Alertmanager.\n* C\u00e1ch x\u00e1c nh\u1eadn Email\/Slack Notification.\n* C\u00e1ch x\u1eed l\u00fd khi Alert kh\u00f4ng k\u00edch ho\u1ea1t.\n\n---\n\n# Chu\u1ea9n b\u1ecb m\u00f4i tr\u01b0\u1eddng\n\nTr\u01b0\u1edbc khi test, ki\u1ec3m tra to\u00e0n b\u1ed9 h\u1ec7 th\u1ed1ng:\n\n## Kubernetes\n\n```bash\nkubectl get pods -n todo-app\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME                              READY   STATUS\ntodo-backend                      1\/1     Running\ntodo-frontend                     1\/1     Running\ntodo-postgres                     1\/1     Running\n```\n\n---\n\n## Monitoring\n\n```bash\nkubectl get pods -n monitoring\n```\n\nC\u1ea7n \u0111\u1ea3m b\u1ea3o:\n\n```text\ngrafana                              Running\n\nprometheus-server                    Running\n\nprometheus-alertmanager              Running\n\nprometheus-kube-state-metrics        Running\n```\n\n---\n\n# Ki\u1ec3m tra Alert hi\u1ec7n t\u1ea1i\n\nTruy c\u1eadp Prometheus:\n\n```bash\nkubectl port-forward \\\nsvc\/prometheus-server \\\n9090:80 \\\n-n monitoring\n```\n\nM\u1edf:\n\n```text\nhttp:\/\/localhost:9090\n```\n\nV\u00e0o:\n\n```text\nAlerts\n```\n\nHi\u1ec7n t\u1ea1i:\n\n```text\nTodoApiDown\n\nState: Inactive\n```\n\n\u0110i\u1ec1u n\u00e0y \u0111\u00fang.\n\nV\u00ec:\n\n```promql\nup{job=\"todo-api\"}\n```\n\n\u0111ang tr\u1ea3 v\u1ec1:\n\n```text\n1\n```\n\nC\u00f3 ngh\u0129a:\n\n```text\nPrometheus\n\n   \u2193\n\ntodo-backend-service\n\n   \u2193\n\n\/actuator\/prometheus\n\nOK\n```\n\n---\n\n# Test 1 - Backend Down Alert\n\n\u0110\u00e2y l\u00e0 Alert quan tr\u1ecdng nh\u1ea5t trong Production.\n\nT\u00ecnh hu\u1ed1ng:\n\nBackend b\u1ecb crash ho\u1eb7c kh\u00f4ng th\u1ec3 ph\u1ee5c v\u1ee5 request.\n\n---\n\n## B\u01b0\u1edbc 1: Scale Backend v\u1ec1 0\n\nCh\u1ea1y:\n\n```bash\nkubectl scale deployment todo-backend \\\n--replicas=0 \\\n-n todo-app\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get pods -n todo-app\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\ntodo-backend\n\nTerminating\n```\n\nho\u1eb7c kh\u00f4ng c\u00f2n Pod Backend.\n\n---\n\n## B\u01b0\u1edbc 2: Ki\u1ec3m tra Metric `up`\n\nTrong Prometheus:\n\nQuery:\n\n```promql\nup{job=\"todo-api\"}\n```\n\nTr\u01b0\u1edbc khi l\u1ed7i:\n\n```text\n1\n```\n\nSau khi Backend m\u1ea5t:\n\n```text\n0\n```\n\n\u0110i\u1ec1u n\u00e0y c\u00f3 ngh\u0129a:\n\nPrometheus kh\u00f4ng scrape \u0111\u01b0\u1ee3c Application Metrics.\n\n---\n\n# Alert chuy\u1ec3n sang Pending\n\nTrong Alert Rule:\n\n```yaml\nfor: 1m\n```\n\nngh\u0129a l\u00e0:\n\n\u0110i\u1ec1u ki\u1ec7n ph\u1ea3i \u0111\u00fang li\u00ean t\u1ee5c 1 ph\u00fat.\n\nNgay sau khi Backend down:\n\n```text\nup == 0\n```\n\nAlert ch\u01b0a g\u1eedi ngay.\n\nTr\u1ea1ng th\u00e1i:\n\n```text\nTodoApiDown\n\nPENDING\n```\n\n---\n\n## V\u00ec sao c\u1ea7n Pending?\n\nN\u1ebfu kh\u00f4ng c\u00f3 `for`:\n\nV\u00ed d\u1ee5:\n\n```text\nPod restart 5 gi\u00e2y\n```\n\nPrometheus c\u00f3 th\u1ec3 g\u1eedi c\u1ea3nh b\u00e1o ngay.\n\n\u0110i\u1ec1u n\u00e0y t\u1ea1o ra r\u1ea5t nhi\u1ec1u Alert gi\u1ea3.\n\n`for` gi\u00fap x\u00e1c nh\u1eadn:\n\n\"\u0110\u00e2y th\u1ef1c s\u1ef1 l\u00e0 m\u1ed9t s\u1ef1 c\u1ed1.\"\n\n---\n\n# Alert chuy\u1ec3n sang Firing\n\nSau 1 ph\u00fat:\n\n\u0110i\u1ec1u ki\u1ec7n v\u1eabn \u0111\u00fang:\n\n```promql\nup{job=\"todo-api\"} == 0\n```\n\nAlert chuy\u1ec3n:\n\n```text\nTodoApiDown\n\nFIRING\n```\n\nLu\u1ed3ng l\u00fac n\u00e0y:\n\n```text\nPrometheus\n\n    |\n    |\n    \u25bc\n\nAlert Rule\n\n    |\n    |\n    \u25bc\n\nAlertmanager\n\n    |\n    |\n    \u25bc\n\nEmail \/ Slack\n```\n\n---\n\n# Ki\u1ec3m tra Alertmanager\n\nPort Forward:\n\n```bash\nkubectl port-forward \\\nsvc\/prometheus-alertmanager \\\n9093:9093 \\\n-n monitoring\n```\n\nM\u1edf:\n\n```text\nhttp:\/\/localhost:9093\n```\n\nV\u00e0o:\n\n```text\nAlerts\n```\n\nB\u1ea1n s\u1ebd th\u1ea5y:\n\n```text\nTodoApiDown\n\nStatus:\n\nFiring\n```\n\nTh\u00f4ng tin bao g\u1ed3m:\n\n* Alert Name.\n* Severity.\n* Namespace.\n* Instance.\n* Start Time.\n\n---\n\n# Kh\u00f4i ph\u1ee5c Backend\n\nScale l\u1ea1i:\n\n```bash\nkubectl scale deployment todo-backend \\\n--replicas=1 \\\n-n todo-app\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get pods -n todo-app\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\ntodo-backend\n\nRunning\n```\n\n---\n\n# Alert chuy\u1ec3n sang Resolved\n\nSau khi Prometheus scrape l\u1ea1i th\u00e0nh c\u00f4ng:\n\nMetric:\n\n```promql\nup{job=\"todo-api\"}\n```\n\ntr\u1edf v\u1ec1:\n\n```text\n1\n```\n\nAlert:\n\n```text\nFiring\n\n\u2193\n\nResolved\n```\n\nN\u1ebfu c\u1ea5u h\u00ecnh:\n\n```yaml\nsend_resolved: true\n```\n\nDevOps nh\u1eadn \u0111\u01b0\u1ee3c:\n\n```text\n[RESOLVED]\n\nTodo API recovered\n```\n\n---\n\n# Test 2 - HTTP 500 Alert\n\nBackend c\u00f3 th\u1ec3 v\u1eabn Running nh\u01b0ng API b\u1ecb l\u1ed7i.\n\n\u0110\u00e2y l\u00e0 t\u00ecnh hu\u1ed1ng r\u1ea5t ph\u1ed5 bi\u1ebfn.\n\nV\u00ed d\u1ee5:\n\n* Database l\u1ed7i.\n* Code Bug.\n* External Service l\u1ed7i.\n\nPod v\u1eabn:\n\n```text\nRunning\n```\n\nnh\u01b0ng ng\u01b0\u1eddi d\u00f9ng kh\u00f4ng s\u1eed d\u1ee5ng \u0111\u01b0\u1ee3c.\n\n---\n\n# T\u1ea1o HTTP 500\n\nS\u1eeda Controller:\n\nV\u00ed d\u1ee5:\n\n```java\n@GetMapping(\"\/api\/todos\")\npublic List<Todo> getTodos(){\n\n    throw new RuntimeException();\n\n}\n```\n\nBuild v\u00e0 Deploy l\u1ea1i.\n\nSau \u0111\u00f3 g\u1ecdi:\n\n```bash\ncurl http:\/\/localhost:8080\/api\/todos\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\n500 Internal Server Error\n```\n\n---\n\n# Ki\u1ec3m tra Metric\n\nPrometheus Query:\n\n```promql\nhttp_server_requests_seconds_count{\nstatus=\"500\"\n}\n```\n\nV\u00ed d\u1ee5:\n\n```text\n25\n```\n\n---\n\n# Ki\u1ec3m tra Alert\n\nN\u1ebfu c\u00f3 Rule:\n\n```yaml\nHighHttp5xxRate\n```\n\nTr\u1ea1ng th\u00e1i:\n\nBan \u0111\u1ea7u:\n\n```text\nInactive\n```\n\nSau khi \u0111\u1ee7 \u0111i\u1ec1u ki\u1ec7n:\n\n```text\nPending\n```\n\nSau:\n\n```yaml\nfor: 2m\n```\n\nChuy\u1ec3n:\n\n```text\nFiring\n```\n\n---\n\n# Test 3 - Pod Restart Alert\n\nT\u00ecnh hu\u1ed1ng:\n\n\u1ee8ng d\u1ee5ng b\u1ecb crash li\u00ean t\u1ee5c.\n\n---\n\n## X\u00f3a Pod Backend\n\nL\u1ea5y t\u00ean Pod:\n\n```bash\nkubectl get pods -n todo-app\n```\n\nV\u00ed d\u1ee5:\n\n```text\ntodo-backend-7d88f7c9d9-x5abc\n```\n\nX\u00f3a:\n\n```bash\nkubectl delete pod \\\ntodo-backend-7d88f7c9d9-x5abc \\\n-n todo-app\n```\n\nDeployment s\u1ebd t\u1ef1 t\u1ea1o Pod m\u1edbi.\n\n---\n\n## Ki\u1ec3m tra Restart Count\n\n```bash\nkubectl get pods -n todo-app\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME\n\nRESTARTS\n\ntodo-backend\n\n5\n```\n\n---\n\n## Prometheus Metric\n\nQuery:\n\n```promql\nkube_pod_container_status_restarts_total\n```\n\nV\u00ed d\u1ee5:\n\n```text\n5\n```\n\nAlert:\n\n```text\nPodRestartTooManyTimes\n\nFiring\n```\n\n---\n\n# Test 4 - CPU cao\n\n\u0110\u00e2y l\u00e0 Alert ph\u1ed5 bi\u1ebfn nh\u1ea5t.\n\n---\n\n# T\u1ea1o t\u1ea3i\n\nC\u00e0i Apache Benchmark n\u1ebfu ch\u01b0a c\u00f3:\n\nmacOS:\n\n```bash\nbrew install httpd\n```\n\nCh\u1ea1y:\n\n```bash\nab \\\n-n 50000 \\\n-c 100 \\\nhttp:\/\/todo.company.local\/api\/todos\n```\n\nGi\u1ea3i th\u00edch:\n\n```text\n-n 50000\n\nT\u1ed5ng s\u1ed1 request\n\n\n-c 100\n\n100 request \u0111\u1ed3ng th\u1eddi\n```\n\n---\n\n# Quan s\u00e1t Dashboard\n\nM\u1edf Grafana.\n\nTheo d\u00f5i:\n\n## Request Rate\n\n```text\n10 req\/s\n\n\u2193\n\n100 req\/s\n```\n\n---\n\n## Latency\n\n```text\n50ms\n\n\u2193\n\n300ms\n```\n\n---\n\n## CPU\n\n```text\n30%\n\n\u2193\n\n90%\n```\n\n---\n\nN\u1ebfu Alert:\n\n```yaml\nHighCPUUsage\n```\n\n\u0111\u01b0\u1ee3c c\u1ea5u h\u00ecnh:\n\nTr\u1ea1ng th\u00e1i:\n\n```text\nPending\n```\n\nsau \u0111\u00f3:\n\n```text\nFiring\n```\n\n---\n\n# Debug khi Alert kh\u00f4ng ch\u1ea1y\n\nTrong th\u1ef1c t\u1ebf, Alert kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng l\u00e0 l\u1ed7i r\u1ea5t th\u01b0\u1eddng g\u1eb7p.\n\n---\n\n## Tr\u01b0\u1eddng h\u1ee3p 1: Kh\u00f4ng th\u1ea5y Alert trong Prometheus\n\nKi\u1ec3m tra:\n\n```text\nStatus\n\n\u2193\n\nRules\n```\n\nN\u1ebfu kh\u00f4ng c\u00f3 Rule:\n\nKi\u1ec3m tra:\n\n```bash\nhelm get values prometheus \\\n-n monitoring\n```\n\n---\n\n## Tr\u01b0\u1eddng h\u1ee3p 2: Alert lu\u00f4n Inactive\n\nKi\u1ec3m tra PromQL.\n\nV\u00ed d\u1ee5:\n\n```promql\nup{job=\"todo-api\"}\n```\n\nN\u1ebfu:\n\n```text\n1\n```\n\nth\u00ec h\u1ec7 th\u1ed1ng \u0111ang kh\u1ecfe.\n\n---\n\n## Tr\u01b0\u1eddng h\u1ee3p 3: Prometheus kh\u00f4ng g\u1eedi Alertmanager\n\nKi\u1ec3m tra:\n\nPrometheus:\n\n```text\nStatus\n\n\u2193\n\nRuntime & Build Information\n```\n\nT\u00ecm:\n\n```text\nAlertmanagers\n```\n\nPh\u1ea3i c\u00f3:\n\n```text\nprometheus-alertmanager:9093\n```\n\n---\n\n## Tr\u01b0\u1eddng h\u1ee3p 4: Alertmanager kh\u00f4ng g\u1eedi Email\n\nKi\u1ec3m tra log:\n\n```bash\nkubectl logs \\\nprometheus-alertmanager-0 \\\n-n monitoring\n```\n\nT\u00ecm l\u1ed7i:\n\n```text\nfailed to send email\n```\n\n---\n\n# T\u1ed5ng k\u1ebft ph\u1ea7n 6\n\nSau ph\u1ea7n n\u00e0y, b\u1ea1n \u0111\u00e3 th\u1ef1c h\u00e0nh:\n\n\u2705 Backend Down Alert\n\u2705 HTTP 500 Alert\n\u2705 Pod Restart Alert\n\u2705 CPU Alert\n\u2705 Quan s\u00e1t Pending\n\u2705 Quan s\u00e1t Firing\n\u2705 Quan s\u00e1t Resolved\n\u2705 Ki\u1ec3m tra Alertmanager Notification\n\nLu\u1ed3ng ho\u00e0n ch\u1ec9nh:\n\n```text\nApplication\n\n     |\n     |\n     \u25bc\n\nMetrics\n\n     |\n     |\n     \u25bc\n\nPrometheus\n\n     |\n     |\n     \u25bc\n\nAlert Rule\n\n     |\n     |\n     \u25bc\n\nAlertmanager\n\n     |\n     |\n     \u25bc\n\nEmail \/ Slack\n\n     |\n     |\n     \u25bc\n\nDevOps\n```\n\n---","published_at":"2026-08-05T11:38:32.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T15:34:03.000000Z","edited_at":"2026-08-05T11:38:31.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":4,"points":0,"views_count":8,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/c576d398-2ede-478b-933c-7325d3554b9b.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":59,"reputation":1181,"posts_count":100,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"alerting","name":"Alerting"},{"slug":"alertmanager","name":"alertmanager"},{"slug":"prometheus","name":"Prometheus"}]},"commentators":{"data":[]}},{"id":104822,"title":"Lab 8.2 - Thi\u1ebft l\u1eadp Alerting v\u1edbi Prometheus v\u00e0 Alertmanager","slug":"ZjJYW6DOVOE","url":"https:\/\/viblo.asia\/p\/lab-82-thiet-lap-alerting-voi-prometheus-va-alertmanager-ZjJYW6DOVOE","user_id":98940,"moderation":null,"transliterated":"lab-82-thiet-lap-alerting-voi-prometheus-va-alertmanager","contents_short":"3. Alert Rule l\u00e0 g\u00ec?\n\nAlert Rule l\u00e0 t\u1eadp h\u1ee3p c\u00e1c \u0111i\u1ec1u ki\u1ec7n \u0111\u01b0\u1ee3c vi\u1ebft b\u1eb1ng PromQL.\n\nPrometheus s\u1ebd th\u1ef1c hi\u1ec7n c\u00e1c b\u01b0\u1edbc sau:\n\n1. Thu th\u1eadp Metrics.\n2. Ch\u1ea1y c\u00e1c Alert Rule theo chu k\u1ef3.\n3. N\u1ebfu bi\u1ec3u th\u1ee9c PromQL tr\u1ea3 v\u1ec1 k\u1ebft qu\u1ea3 v\u00e0 duy tr\u00ec trong kho\u1ea3ng th\u1eddi gian for, Alert s\u1ebd chuy\u1ec3n sang tr\u1ea1ng th\u00e1i Firing.\n4. G\u1eedi Alert t\u1edbi Alertmanager.\n\nV\u00ed d\u1ee5:\n\n3.1 C\u1ea5u tr\u00fac m\u1ed9t Alert Rule\n\nM\u1ed9t Alert Rule th\u01b0\u1eddng c\u00f3 c\u1ea5u tr\u00fa...","contents":"# 3. Alert Rule l\u00e0 g\u00ec?\n\nAlert Rule l\u00e0 t\u1eadp h\u1ee3p c\u00e1c \u0111i\u1ec1u ki\u1ec7n \u0111\u01b0\u1ee3c vi\u1ebft b\u1eb1ng **PromQL**.\n\nPrometheus s\u1ebd th\u1ef1c hi\u1ec7n c\u00e1c b\u01b0\u1edbc sau:\n\n1. Thu th\u1eadp Metrics.\n2. Ch\u1ea1y c\u00e1c Alert Rule theo chu k\u1ef3.\n3. N\u1ebfu bi\u1ec3u th\u1ee9c PromQL tr\u1ea3 v\u1ec1 k\u1ebft qu\u1ea3 v\u00e0 duy tr\u00ec trong kho\u1ea3ng th\u1eddi gian `for`, Alert s\u1ebd chuy\u1ec3n sang tr\u1ea1ng th\u00e1i **Firing**.\n4. G\u1eedi Alert t\u1edbi Alertmanager.\n\nV\u00ed d\u1ee5:\n\n```text\nCPU > 80%\n\u2193\nduy tr\u00ec 5 ph\u00fat\n\u2193\nAlert Firing\n\u2193\nAlertmanager\n\u2193\nEmail \/ Slack\n```\n\n---\n\n## 3.1 C\u1ea5u tr\u00fac m\u1ed9t Alert Rule\n\nM\u1ed9t Alert Rule th\u01b0\u1eddng c\u00f3 c\u1ea5u tr\u00fac nh\u01b0 sau:\n\n```yaml\ngroups:\n- name: kubernetes-alerts\n  rules:\n  - alert: HighCPUUsage\n    expr: ...\n    for: 5m\n    labels:\n      severity: warning\n    annotations:\n      summary: ...\n      description: ...\n```\n\nTrong \u0111\u00f3:\n\n| Thu\u1ed9c t\u00ednh  | \u00dd ngh\u0129a                                       |\n| ----------- | --------------------------------------------- |\n| alert       | T\u00ean Alert                                     |\n| expr        | Bi\u1ec3u th\u1ee9c PromQL                              |\n| for         | \u0110i\u1ec1u ki\u1ec7n ph\u1ea3i duy tr\u00ec trong bao l\u00e2u          |\n| labels      | Th\u00f4ng tin b\u1ed5 sung \u0111\u1ec3 ph\u00e2n lo\u1ea1i Alert          |\n| annotations | N\u1ed9i dung hi\u1ec3n th\u1ecb trong Alertmanager v\u00e0 Email |\n\n---\n\n## 3.2 T\u1ea1o file Alert Rules\n\nTrong Lab n\u00e0y, ch\u00fang ta s\u1ebd qu\u1ea3n l\u00fd to\u00e0n b\u1ed9 Alert trong m\u1ed9t file.\n\nT\u1ea1o file:\n\n```text\nmonitoring\/alert-rules.yml\n```\n\n---\n\n### Alert 1 - \u1ee8ng d\u1ee5ng kh\u00f4ng c\u00f2n ph\u1ea3n h\u1ed3i\n\n\u0110\u00e2y l\u00e0 Alert quan tr\u1ecdng nh\u1ea5t.\n\nN\u1ebfu Prometheus kh\u00f4ng c\u00f2n scrape \u0111\u01b0\u1ee3c Metrics c\u1ee7a \u1ee9ng d\u1ee5ng, r\u1ea5t c\u00f3 th\u1ec3:\n\n* Pod b\u1ecb Crash\n* \u1ee8ng d\u1ee5ng b\u1ecb treo\n* Service l\u1ed7i\n* Network g\u1eb7p s\u1ef1 c\u1ed1\n\nTh\u00eam Rule:\n\n```yaml\ngroups:\n- name: todo-alerts\n  rules:\n  - alert: TodoApiDown\n    expr: up{job=\"todo-api\"} == 0\n    for: 1m\n    labels:\n      severity: critical\n    annotations:\n      summary: Todo API is down\n      description: Prometheus cannot scrape metrics from Todo API for more than 1 minute.\n```\n\n---\n\n#### Gi\u1ea3i th\u00edch PromQL\n\n```promql\nup{job=\"todo-api\"} == 0\n```\n\nMetric:\n\n```text\nup\n```\n\n\u0111\u01b0\u1ee3c Prometheus t\u1ef1 sinh ra.\n\nGi\u00e1 tr\u1ecb:\n\n```text\n1\n```\n\nngh\u0129a l\u00e0:\n\nPrometheus scrape th\u00e0nh c\u00f4ng.\n\nGi\u00e1 tr\u1ecb:\n\n```text\n0\n```\n\nngh\u0129a l\u00e0:\n\nPrometheus kh\u00f4ng th\u1ec3 k\u1ebft n\u1ed1i t\u1edbi endpoint.\n\n\u0110\u00e2y l\u00e0 Alert ph\u1ed5 bi\u1ebfn nh\u1ea5t trong m\u1ecdi h\u1ec7 th\u1ed1ng Prometheus.\n\n---\n\n### Alert 2 - Pod Restart li\u00ean t\u1ee5c\n\nPod Restart nhi\u1ec1u l\u1ea7n th\u01b0\u1eddng l\u00e0 d\u1ea5u hi\u1ec7u c\u1ee7a:\n\n* CrashLoopBackOff\n* Out Of Memory\n* L\u1ed7i \u1ee9ng d\u1ee5ng\n* Sai c\u1ea5u h\u00ecnh\n\nTh\u00eam Rule:\n\n```yaml\n  - alert: PodRestartTooManyTimes\n    expr: increase(\n      kube_pod_container_status_restarts_total{\n      namespace=\"todo-app\"\n      }[5m]) > 3\n    for: 2m\n    labels:\n      severity: warning\n    annotations:\n      summary: Pod restarted too many times\n      description: A Pod in namespace todo-app restarted more than three times within five minutes.\n```\n\n---\n\n#### Gi\u1ea3i th\u00edch PromQL\n\nMetric:\n\n```text\nkube_pod_container_status_restarts_total\n```\n\n\u0111\u01b0\u1ee3c cung c\u1ea5p b\u1edfi:\n\n```text\nkube-state-metrics\n```\n\nMetric n\u00e0y l\u00e0 Counter.\n\nV\u00ed d\u1ee5:\n\n```text\n10\n\u2193\n11\n\u2193\n12\n```\n\nH\u00e0m:\n\n```promql\nincrease(...[5m])\n```\n\nt\u00ednh s\u1ed1 l\u1ea7n Counter t\u0103ng trong 5 ph\u00fat g\u1ea7n nh\u1ea5t.\n\nV\u00ed d\u1ee5:\n\n```text\n10\n\u2193\n14\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\n4 l\u1ea7n restart\n```\n\nN\u1ebfu:\n\n```text\n> 3\n```\n\nAlert s\u1ebd \u0111\u01b0\u1ee3c k\u00edch ho\u1ea1t.\n\n---\n\n### Alert 3 - Memory s\u1eed d\u1ee5ng qu\u00e1 cao\n\nN\u1ebfu Pod s\u1eed d\u1ee5ng g\u1ea7n h\u1ebft Memory \u0111\u01b0\u1ee3c c\u1ea5p, Kubernetes c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n OOMKill.\n\nRule:\n\n```yaml\n  - alert: HighMemoryUsage\n    expr: (\n      container_memory_working_set_bytes{\n      namespace=\"todo-app\",\n      container!=\"\",\n      image!=\"\"\n      }\n      \/\n      container_spec_memory_limit_bytes{\n      namespace=\"todo-app\",\n      container!=\"\",\n      image!=\"\"\n      }\n    ) > 0.9\n    for: 5m\n    labels:\n      severity: warning\n    annotations:\n      summary: Pod memory usage is above 90%\n      description: Memory usage exceeded 90 percent for more than five minutes.\n```\n\n---\n\n#### Gi\u1ea3i th\u00edch\n\nBi\u1ec3u th\u1ee9c:\n\n```text\nMemory \u0111ang s\u1eed d\u1ee5ng\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nMemory Limit\n```\n\nN\u1ebfu:\n\n```text\n95%\n```\n\ntrong:\n\n```text\n5 ph\u00fat\n```\n\nAlert s\u1ebd chuy\u1ec3n sang **Firing**.\n\n---\n\n### Alert 4 - HTTP 5xx t\u0103ng b\u1ea5t th\u01b0\u1eddng\n\nSau Lab 7, ch\u00fang ta \u0111\u00e3 c\u00f3:\n\n```text\nhttp_server_requests_seconds_count\n```\n\nT\u1eeb Metric n\u00e0y c\u00f3 th\u1ec3 ph\u00e1t hi\u1ec7n s\u1ed1 l\u01b0\u1ee3ng HTTP 5xx.\n\nRule:\n\n```yaml\n  - alert: HighHttp5xxRate\n    expr: |\n      sum(\n        rate(\n          http_server_requests_seconds_count{\n            application=\"todo-api\",\n            status=~\"5..\"\n          }[5m]\n        )\n      ) > 1\n    for: 2m\n    labels:\n      severity: critical\n    annotations:\n      summary: High HTTP 5xx rate\n      description: Todo API is returning more than one HTTP 5xx response per second.\n```\n\n---\n\n#### Gi\u1ea3i th\u00edch\n\nBi\u1ec3u th\u1ee9c:\n\n```promql\nrate(http_server_requests_seconds_count[5m])\n```\n\nt\u00ednh:\n\n```text\nRequest \/ second\n```\n\nSau \u0111\u00f3 ch\u1ec9 l\u1ea5y:\n\n```text\nstatus=500\n\n501\n\n502\n\n503\n\n504\n```\n\nN\u1ebfu:\n\n```text\n>1 l\u1ed7i m\u1ed7i gi\u00e2y\n```\n\ntrong:\n\n```text\n2 ph\u00fat\n```\n\nAlert s\u1ebd \u0111\u01b0\u1ee3c g\u1eedi.\n\n---\n\n### Alert 5 - Request Latency t\u0103ng cao\n\nCPU th\u1ea5p kh\u00f4ng \u0111\u1ed3ng ngh\u0129a \u1ee9ng d\u1ee5ng ho\u1ea1t \u0111\u1ed9ng t\u1ed1t.\n\nN\u1ebfu Request Latency t\u0103ng m\u1ea1nh, r\u1ea5t c\u00f3 th\u1ec3:\n\n* Database ch\u1eadm.\n* External API ph\u1ea3n h\u1ed3i ch\u1eadm.\n* Deadlock.\n* Thread Pool b\u1ecb \u0111\u1ea7y.\n\nRule:\n\n```yaml\n  - alert: HighRequestLatency\n    expr: |\n      (\n        rate(\n          http_server_requests_seconds_sum{\n          application=\"todo-api\"\n          }[5m]\n        )\n      )\n      \/\n      (\n        rate(\n          http_server_requests_seconds_count{\n          application=\"todo-api\"\n          }[5m]\n        )\n      )\n      > 0.5\n    for: 5m\n    labels:\n      severity: warning\n    annotations:\n      summary: High request latency\n      description: Average request latency is higher than 500 ms.\n```\n\n---\n\n#### Gi\u1ea3i th\u00edch\n\nLatency trung b\u00ecnh \u0111\u01b0\u1ee3c t\u00ednh b\u1eb1ng:\n\n```text\nT\u1ed5ng th\u1eddi gian x\u1eed l\u00fd\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nT\u1ed5ng s\u1ed1 Request\n```\n\nN\u1ebfu k\u1ebft qu\u1ea3:\n\n```text\n0.5\n```\n\nngh\u0129a l\u00e0:\n\n```text\n500 ms\n```\n\n---\n\n## 3.3 Ho\u00e0n ch\u1ec9nh file Alert Rule\n\nSau khi th\u00eam c\u00e1c Rule tr\u00ean, file `monitoring\/alert-rules.yml` s\u1ebd g\u1ed3m m\u1ed9t nh\u00f3m Alert d\u00e0nh cho \u1ee9ng d\u1ee5ng Todo.\n\nC\u00e1c Alert bao g\u1ed3m:\n\n| Alert                  | M\u1ee5c \u0111\u00edch                                |\n| ---------------------- | --------------------------------------- |\n| TodoApiDown            | Ph\u00e1t hi\u1ec7n \u1ee9ng d\u1ee5ng kh\u00f4ng c\u00f2n ph\u1ea3n h\u1ed3i   |\n| PodRestartTooManyTimes | Ph\u00e1t hi\u1ec7n Pod Restart b\u1ea5t th\u01b0\u1eddng        |\n| HighMemoryUsage        | Ph\u00e1t hi\u1ec7n Pod s\u1eed d\u1ee5ng qu\u00e1 nhi\u1ec1u Memory  |\n| HighHttp5xxRate        | Ph\u00e1t hi\u1ec7n API tr\u1ea3 v\u1ec1 nhi\u1ec1u l\u1ed7i HTTP 5xx |\n| HighRequestLatency     | Ph\u00e1t hi\u1ec7n \u1ee9ng d\u1ee5ng ph\u1ea3n h\u1ed3i ch\u1eadm        |\n\n\u0110\u00e2y l\u00e0 nh\u1eefng Alert c\u01a1 b\u1ea3n nh\u01b0ng r\u1ea5t ph\u1ed5 bi\u1ebfn trong h\u1ea7u h\u1ebft c\u00e1c h\u1ec7 th\u1ed1ng Production.\n\n---\n\n# 4. Prometheus qu\u1ea3n l\u00fd Alert Rule nh\u01b0 th\u1ebf n\u00e0o?\n\nPrometheus s\u1eed d\u1ee5ng file c\u1ea5u h\u00ecnh:\n\n```yaml\nprometheus.yml\n```\n\nTrong file n\u00e0y c\u00f3 m\u1ed9t ph\u1ea7n quan tr\u1ecdng:\n\n```yaml\nrule_files:\n  - \/etc\/config\/alert-rules\/*.yaml\n```\n\n`rule_files` khai b\u00e1o n\u01a1i Prometheus t\u00ecm ki\u1ebfm c\u00e1c Alert Rule.\n\nKhi Prometheus kh\u1edfi \u0111\u1ed9ng, n\u00f3 s\u1ebd:\n\n1. \u0110\u1ecdc file `prometheus.yml`.\n2. T\u00ecm c\u00e1c file \u0111\u01b0\u1ee3c khai b\u00e1o trong `rule_files`.\n3. Load c\u00e1c Alert Rule.\n4. B\u1eaft \u0111\u1ea7u \u0111\u00e1nh gi\u00e1 c\u00e1c bi\u1ec3u th\u1ee9c PromQL theo chu k\u1ef3.\n\nLu\u1ed3ng ho\u1ea1t \u0111\u1ed9ng:\n\n```text\nalert-rules.yaml\n\n        |\n        \u25bc\n\nPrometheus Config\n\n        |\n        \u25bc\n\nPrometheus Rule Engine\n\n        |\n        \u25bc\n\nEvaluate PromQL\n\n        |\n        \u25bc\n\nAlertmanager\n```\n\n---\n\n## Ki\u1ec3m tra Helm Chart \u0111ang s\u1eed d\u1ee5ng\n\nTrong Lab tr\u01b0\u1edbc, ch\u00fang ta \u0111\u00e3 tri\u1ec3n khai:\n\n```bash\nhelm list -n monitoring\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nNAME          NAMESPACE\ngrafana       monitoring\nprometheus    monitoring\n```\n\nChart:\n\n```text\nprometheus-community\/prometheus\n```\n\n\u0110\u00e2y kh\u00f4ng ph\u1ea3i l\u00e0:\n\n```text\nkube-prometheus-stack\n```\n\nn\u00ean ch\u00fang ta s\u1ebd kh\u00f4ng s\u1eed d\u1ee5ng:\n\n```yaml\nPrometheusRule\n```\n\nho\u1eb7c:\n\n```bash\nkubectl apply -f prometheusrule.yaml\n```\n\nC\u00e1ch \u0111\u00f3 ch\u1ec9 d\u00e0nh cho Prometheus Operator.\n\nV\u1edbi chart hi\u1ec7n t\u1ea1i, ch\u00fang ta s\u1ebd qu\u1ea3n l\u00fd Alert Rule th\u00f4ng qua:\n\n```yaml\nserverFiles\n```\n\ntrong Helm values.\n\n---\n\n### B\u01b0\u1edbc 1. T\u1ea1o file Alert Rule\n\nT\u1ea1o th\u01b0 m\u1ee5c:\n\n```bash\nmkdir monitoring\n```\n\nT\u1ea1o file:\n\n```bash\ntouch monitoring\/alert-rules.yml\n```\n\nN\u1ed9i dung:\n\n```yaml\ngroups:\n\n- name: todo-alerts\n\n  rules:\n\n  - alert: TodoApiDown\n\n    expr: up{job=\"todo-api\"} == 0\n\n    for: 1m\n\n    labels:\n\n      severity: critical\n\n    annotations:\n\n      summary: Todo API is down\n\n      description: Prometheus cannot scrape Todo API.\n```\n\n\u0110\u00e2y l\u00e0 Alert Rule \u0111\u1ea7u ti\u00ean.\n\n\u00dd ngh\u0129a:\n\nN\u1ebfu:\n\n```promql\nup{job=\"todo-api\"} == 0\n```\n\ntrong:\n\n```yaml\nfor: 1m\n```\n\nth\u00ec Alert s\u1ebd \u0111\u01b0\u1ee3c k\u00edch ho\u1ea1t.\n\n---\n\n### B\u01b0\u1edbc 2. Ki\u1ec3m tra Prometheus values hi\u1ec7n t\u1ea1i\n\nTr\u01b0\u1edbc khi ch\u1ec9nh s\u1eeda, ki\u1ec3m tra c\u1ea5u h\u00ecnh hi\u1ec7n t\u1ea1i:\n\n```bash\nhelm get values prometheus \\\n-n monitoring\n```\n\nHi\u1ec7n t\u1ea1i b\u1ea1n \u0111ang c\u00f3:\n\n```yaml\nextraScrapeConfigs: |\n  - job_name: todo-api\n```\n\n\u0110\u00e2y l\u00e0 c\u1ea5u h\u00ecnh c\u1ee7a Lab 7 \u0111\u1ec3 Prometheus scrape Spring Boot Actuator.\n\nCh\u00fang ta c\u1ea7n gi\u1eef nguy\u00ean c\u1ea5u h\u00ecnh n\u00e0y.\n\n---\n\n### B\u01b0\u1edbc 3. C\u1eadp nh\u1eadt file prometheus-values.yaml\n\nM\u1edf:\n\n```bash\nprometheus-values.yaml\n```\n\nHi\u1ec7n t\u1ea1i:\n\n```yaml\nextraScrapeConfigs: |\n  - job_name: todo-api\n\n    metrics_path: \/actuator\/prometheus\n\n    static_configs:\n\n      - targets:\n\n          - todo-backend-service.todo-app.svc.cluster.local:8080\n```\n\nTh\u00eam ph\u1ea7n:\n\n```yaml\nserverFiles:\n\n  alert-rules.yml: |\n\n    groups:\n\n    - name: todo-alerts\n\n      rules:\n\n      - alert: TodoApiDown\n\n        expr: up{job=\"todo-api\"} == 0\n\n        for: 1m\n\n        labels:\n\n          severity: critical\n\n        annotations:\n\n          summary: Todo API is down\n\n          description: Prometheus cannot scrape Todo API.\n```\n\nSau khi ho\u00e0n ch\u1ec9nh:\n\n```yaml\nextraScrapeConfigs: |\n  - job_name: todo-api\n\n    metrics_path: \/actuator\/prometheus\n\n    static_configs:\n\n      - targets:\n\n          - todo-backend-service.todo-app.svc.cluster.local:8080\n\n\nserverFiles:\n\n  alert-rules.yml: |\n\n    groups:\n\n    - name: todo-alerts\n\n      rules:\n\n      - alert: TodoApiDown\n\n        expr: up{job=\"todo-api\"} == 0\n\n        for: 1m\n\n        labels:\n\n          severity: critical\n\n        annotations:\n\n          summary: Todo API is down\n\n          description: Prometheus cannot scrape Todo API.\n```\n\n---\n\n### B\u01b0\u1edbc 4. Khai b\u00e1o Rule File cho Prometheus\n\nB\u00e2y gi\u1edd Prometheus c\u1ea7n bi\u1ebft file:\n\n```text\nalert-rules.yml\n```\n\nn\u1eb1m \u1edf \u0111\u00e2u.\n\nTh\u00eam ti\u1ebfp:\n\n```yaml\nserverFiles:\n\n  prometheus.yml:\n\n    rule_files:\n\n      - \/etc\/config\/alert-rules.yml\n```\n\nTuy nhi\u00ean c\u1ea7n ch\u00fa \u00fd.\n\nTrong chart `prometheus-community\/prometheus`, `prometheus.yml` m\u1eb7c \u0111\u1ecbnh \u0111\u00e3 c\u00f3 r\u1ea5t nhi\u1ec1u c\u1ea5u h\u00ecnh.\n\nV\u00ec v\u1eady **kh\u00f4ng n\u00ean ghi \u0111\u00e8 to\u00e0n b\u1ed9 file**.\n\nC\u00e1ch an to\u00e0n h\u01a1n l\u00e0 s\u1eed d\u1ee5ng:\n\n```yaml\nserverFiles:\n  prometheus.yml:\n```\n\nv\u1edbi \u0111\u1ea7y \u0111\u1ee7 n\u1ed9i dung hi\u1ec7n t\u1ea1i.\n\n\u0110\u1ec3 tr\u00e1nh m\u1ea5t c\u1ea5u h\u00ecnh scrape c\u1ee7a Lab 7.\n\n---\n\n# C\u00e1ch \u0111\u01a1n gi\u1ea3n h\u01a1n (khuy\u1ebfn ngh\u1ecb)\n\nV\u1edbi chart b\u1ea1n \u0111ang d\u00f9ng, c\u00e1ch t\u1ed1t h\u01a1n l\u00e0 d\u00f9ng:\n\n```yaml\nserverFiles:\n  alerts:\n```\n\nV\u00ed d\u1ee5:\n\n```yaml\nserverFiles:\n  alerts:\n    todo-alerts.yml: |\n      groups:\n      - name: todo-alerts\n        rules:\n        - alert: TodoApiDown\n          expr: up{job=\"todo-api\"} == 0\n          for: 1m\n          labels:\n            severity: critical\n          annotations:\n            summary: Todo API is down\n```\n\nChart s\u1ebd t\u1ef1 mount file Alert v\u00e0o Prometheus.\n\n---\n\n### B\u01b0\u1edbc 5. Upgrade Helm\n\nSau khi ch\u1ec9nh s\u1eeda:\n\n```bash\nhelm upgrade prometheus \\\nprometheus-community\/prometheus \\\n-f prometheus-values.yaml \\\n-n monitoring\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nRelease \"prometheus\" has been upgraded\n```\n\n---\n\n### B\u01b0\u1edbc 6. Ki\u1ec3m tra Prometheus Pod\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get pods -n monitoring\n```\n\nV\u00ed d\u1ee5:\n\n```text\nprometheus-server-xxxx   2\/2   Running\n```\n\nN\u1ebfu Pod restart:\n\n```bash\nkubectl describe pod \\\nprometheus-server-xxxx \\\n-n monitoring\n```\n\nKi\u1ec3m tra l\u1ed7i mount config.\n\n---\n\n### B\u01b0\u1edbc 7. Ki\u1ec3m tra Alert Rule trong Prometheus UI\n\nPort-forward:\n\n```bash\nkubectl port-forward \\\nsvc\/prometheus-server \\\n9090:80 \\\n-n monitoring\n```\n\nTruy c\u1eadp:\n\n```\nhttp:\/\/localhost:9090\n```\n\nV\u00e0o:\n\n```\nStatus\n    \u2193\nRules\n```\n\nB\u1ea1n s\u1ebd th\u1ea5y:\n\n```\ntodo-alerts\n\nTodoApiDown\n```\n\n---\n\n### B\u01b0\u1edbc 8. Ki\u1ec3m tra tr\u1ea1ng th\u00e1i Alert\n\nV\u00e0o:\n\n```\nAlerts\n```\n\nBan \u0111\u1ea7u:\n\n```\nTodoApiDown\n\nState:\nInactive\n```\n\n\u0110i\u1ec1u n\u00e0y \u0111\u00fang.\n\nV\u00ec hi\u1ec7n t\u1ea1i:\n\n```promql\nup{job=\"todo-api\"}\n```\n\n\u0111ang b\u1eb1ng:\n\n```\n1\n```\n\nngh\u0129a l\u00e0 Backend v\u1eabn ho\u1ea1t \u0111\u1ed9ng.\n\n---\n\n### B\u01b0\u1edbc 9. Ki\u1ec3m tra b\u1eb1ng PromQL\n\nTrong Prometheus:\n\nCh\u1ea1y:\n\n```promql\nup{job=\"todo-api\"}\n```\n\nK\u1ebft qu\u1ea3:\n\n```\n1\n```\n\nC\u00f3 ngh\u0129a:\n\n```\nPrometheus\n    |\n    |\n    \u25bc\ntodo-backend-service\n    |\n    |\n    \u25bc\n\/actuator\/prometheus\n\nOK\n```\n\n---\n\n### B\u01b0\u1edbc 10. Test Alert Rule\n\n\u0110\u1ec3 th\u1eed Alert, t\u1ea1m th\u1eddi l\u00e0m cho Backend kh\u00f4ng scrape \u0111\u01b0\u1ee3c.\n\nV\u00ed d\u1ee5 scale Deployment v\u1ec1 0:\n\n```bash\nkubectl scale deployment todo-backend \\\n--replicas=0 \\\n-n todo-app\n```\n\nSau kho\u1ea3ng 1 ph\u00fat:\n\nPrometheus:\n\n```\nAlerts\n```\n\ns\u1ebd th\u1ea5y:\n\n```\nTodoApiDown\n\nPending\n```\n\nSau khi \u0111\u1ee7:\n\n```yaml\nfor: 1m\n```\n\ns\u1ebd chuy\u1ec3n:\n\n```\nFiring\n```\n\nSau \u0111\u00f3 Alert s\u1ebd \u0111\u01b0\u1ee3c g\u1eedi sang Alertmanager.\n\n---","published_at":"2026-08-05T11:35:28.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T19:11:03.000000Z","edited_at":"2026-08-05T11:26:29.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":5,"points":0,"views_count":13,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/669ddd60-ee4a-4c26-a301-6dae72a7120a.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":59,"reputation":1181,"posts_count":100,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"alertmanager","name":"alertmanager"},{"slug":"prometheus","name":"Prometheus"},{"slug":"alerting","name":"Alerting"},{"slug":"kubernetes","name":"Kubernetes"}]},"commentators":{"data":[]}},{"id":104821,"title":"Lab 9.6 - X\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng Centralized Logging v\u1edbi Fluent Bit, Loki v\u00e0 Grafana","slug":"8X4EjY0BJN2","url":"https:\/\/viblo.asia\/p\/lab-96-xay-dung-he-thong-centralized-logging-voi-fluent-bit-loki-va-grafana-8X4EjY0BJN2","user_id":98940,"moderation":null,"transliterated":"lab-96-xay-dung-he-thong-centralized-logging-voi-fluent-bit-loki-va-grafana","contents_short":"Ph\u1ea7n 6 - Best Practices v\u1ec1 Logging trong Kubernetes Production\n\nSau khi ho\u00e0n th\u00e0nh c\u00e1c ph\u1ea7n tr\u01b0\u1edbc, ch\u00fang ta \u0111\u00e3 x\u00e2y d\u1ef1ng \u0111\u01b0\u1ee3c m\u1ed9t h\u1ec7 th\u1ed1ng Logging ho\u00e0n ch\u1ec9nh:\n\n* Fluent Bit thu th\u1eadp log.\n* Loki l\u01b0u tr\u1eef log.\n* Grafana t\u00ecm ki\u1ebfm v\u00e0 ph\u00e2n t\u00edch log.\n* DevOps c\u00f3 th\u1ec3 k\u1ebft h\u1ee3p Metrics, Alerts v\u00e0 Logs \u0111\u1ec3 \u0111i\u1ec1u tra s\u1ef1 c\u1ed1.\n\nTuy nhi\u00ean, tri\u1ec3n khai \u0111\u01b0\u1ee3c m\u1ed9t h\u1ec7 th\u1ed1ng Logging m\u1edbi ch\u1ec9 l\u00e0 b\u01b0\u1edbc kh\u1edfi \u0111\u1ea7u.\n\nTrong m\u00f4i t...","contents":"# Ph\u1ea7n 6 - Best Practices v\u1ec1 Logging trong Kubernetes Production\n\nSau khi ho\u00e0n th\u00e0nh c\u00e1c ph\u1ea7n tr\u01b0\u1edbc, ch\u00fang ta \u0111\u00e3 x\u00e2y d\u1ef1ng \u0111\u01b0\u1ee3c m\u1ed9t h\u1ec7 th\u1ed1ng Logging ho\u00e0n ch\u1ec9nh:\n\n* Fluent Bit thu th\u1eadp log.\n* Loki l\u01b0u tr\u1eef log.\n* Grafana t\u00ecm ki\u1ebfm v\u00e0 ph\u00e2n t\u00edch log.\n* DevOps c\u00f3 th\u1ec3 k\u1ebft h\u1ee3p Metrics, Alerts v\u00e0 Logs \u0111\u1ec3 \u0111i\u1ec1u tra s\u1ef1 c\u1ed1.\n\nTuy nhi\u00ean, tri\u1ec3n khai \u0111\u01b0\u1ee3c m\u1ed9t h\u1ec7 th\u1ed1ng Logging m\u1edbi ch\u1ec9 l\u00e0 b\u01b0\u1edbc kh\u1edfi \u0111\u1ea7u.\n\nTrong m\u00f4i tr\u01b0\u1eddng Production, c\u00e1ch **ghi log** c\u0169ng quan tr\u1ecdng kh\u00f4ng k\u00e9m c\u00e1ch **thu th\u1eadp log**.\n\nM\u1ed9t \u1ee9ng d\u1ee5ng ghi log kh\u00f4ng \u0111\u00fang c\u00e1ch s\u1ebd khi\u1ebfn vi\u1ec7c \u0111i\u1ec1u tra s\u1ef1 c\u1ed1 tr\u1edf n\u00ean r\u1ea5t kh\u00f3 kh\u0103n, d\u00f9 b\u1ea1n c\u00f3 s\u1eed d\u1ee5ng Fluent Bit, Loki hay Grafana.\n\nTrong ph\u1ea7n cu\u1ed1i c\u1ee7a Lab n\u00e0y, ch\u00fang ta s\u1ebd t\u00ecm hi\u1ec3u c\u00e1c Best Practices khi x\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng Logging tr\u00ean Kubernetes.\n\n---\n\n# M\u1ee5c ti\u00eau c\u1ee7a ph\u1ea7n n\u00e0y\n\nSau khi ho\u00e0n th\u00e0nh ph\u1ea7n n\u00e0y, b\u1ea1n s\u1ebd:\n\n* Hi\u1ec3u c\u00e1c nguy\u00ean t\u1eafc ghi log trong Kubernetes.\n* Bi\u1ebft c\u00e1ch thi\u1ebft k\u1ebf log d\u1ec5 t\u00ecm ki\u1ebfm v\u00e0 d\u1ec5 ph\u00e2n t\u00edch.\n* Hi\u1ec3u c\u00e1c m\u1ee9c Log Level.\n* Tr\u00e1nh nh\u1eefng l\u1ed7i ph\u1ed5 bi\u1ebfn khi ghi log.\n* Chu\u1ea9n b\u1ecb cho m\u00f4i tr\u01b0\u1eddng Production.\n\n---\n\n# 1. Ghi log ra stdout thay v\u00ec ghi v\u00e0o file\n\n\u0110\u00e2y l\u00e0 nguy\u00ean t\u1eafc quan tr\u1ecdng nh\u1ea5t khi ch\u1ea1y \u1ee9ng d\u1ee5ng trong Kubernetes.\n\nNhi\u1ec1u l\u1eadp tr\u00ecnh vi\u00ean v\u1eabn c\u00f3 th\u00f3i quen ghi log v\u00e0o file:\n\n```text\nlogs\/application.log\n\nlogs\/error.log\n```\n\n\u0110i\u1ec1u n\u00e0y ho\u1ea1t \u0111\u1ed9ng t\u1ed1t tr\u00ean m\u00e1y ch\u1ee7 truy\u1ec1n th\u1ed1ng.\n\nTuy nhi\u00ean, trong Kubernetes, Container c\u00f3 t\u00ednh ch\u1ea5t **ephemeral** (t\u1ed3n t\u1ea1i t\u1ea1m th\u1eddi).\n\nV\u00ed d\u1ee5:\n\n```bash\nkubectl delete pod todo-backend\n```\n\nNgay khi Pod b\u1ecb x\u00f3a:\n\n* Container bi\u1ebfn m\u1ea5t.\n* File log c\u0169ng bi\u1ebfn m\u1ea5t.\n\nN\u1ebfu DevOps ch\u01b0a k\u1ecbp sao l\u01b0u log, to\u00e0n b\u1ed9 th\u00f4ng tin ph\u1ee5c v\u1ee5 \u0111i\u1ec1u tra s\u1ef1 c\u1ed1 s\u1ebd m\u1ea5t theo.\n\nThay v\u00e0o \u0111\u00f3, h\u00e3y \u0111\u1ec3 \u1ee9ng d\u1ee5ng ghi log ra Console:\n\n```java\nlog.info(\"Create Todo successfully\");\n\nlog.error(\"Database connection timeout\");\n```\n\nSpring Boot s\u1ebd ghi log ra:\n\n```text\nstdout\n```\n\nContainer Runtime s\u1ebd l\u01b0u log v\u00e0o:\n\n```text\n\/var\/log\/containers\n```\n\nFluent Bit s\u1ebd t\u1ef1 \u0111\u1ed9ng thu th\u1eadp v\u00e0 g\u1eedi log t\u1edbi Loki.\n\n\u0110\u00e2y l\u00e0 c\u00e1ch ho\u1ea1t \u0111\u1ed9ng chu\u1ea9n c\u1ee7a h\u1ea7u h\u1ebft c\u00e1c \u1ee9ng d\u1ee5ng ch\u1ea1y tr\u00ean Kubernetes.\n\n---\n\n# 2. Ghi log c\u00f3 c\u1ea5u tr\u00fac (Structured Logging)\n\nM\u1ed9t l\u1ed7i ph\u1ed5 bi\u1ebfn l\u00e0 ghi log d\u01b0\u1edbi d\u1ea1ng v\u0103n b\u1ea3n t\u1ef1 do.\n\nV\u00ed d\u1ee5:\n\n```text\nSomething went wrong\n```\n\nNh\u00ecn v\u00e0o log n\u00e0y, ch\u00fang ta kh\u00f4ng bi\u1ebft:\n\n* L\u1ed7i g\u00ec?\n* API n\u00e0o?\n* Ng\u01b0\u1eddi d\u00f9ng n\u00e0o?\n* Request n\u00e0o?\n\nM\u1ed9t log t\u1ed1t n\u00ean ch\u1ee9a \u0111\u1ea7y \u0111\u1ee7 th\u00f4ng tin.\n\nV\u00ed d\u1ee5:\n\n```text\n2026-08-05 10:15:08 ERROR POST \/api\/todos userId=15 Database connection timeout\n```\n\nT\u1ed1t h\u01a1n n\u1eefa l\u00e0 s\u1eed d\u1ee5ng **JSON Logging**:\n\n```json\n{\n  \"timestamp\": \"2026-08-05T10:15:08Z\",\n  \"level\": \"ERROR\",\n  \"service\": \"todo-api\",\n  \"method\": \"POST\",\n  \"path\": \"\/api\/todos\",\n  \"status\": 500,\n  \"message\": \"Database connection timeout\"\n}\n```\n\nLog c\u00f3 c\u1ea5u tr\u00fac gi\u00fap:\n\n* D\u1ec5 t\u00ecm ki\u1ebfm.\n* D\u1ec5 th\u1ed1ng k\u00ea.\n* D\u1ec5 ph\u00e2n t\u00edch b\u1eb1ng LogQL.\n\nTrong c\u00e1c h\u1ec7 th\u1ed1ng Production hi\u1ec7n nay, JSON Logging g\u1ea7n nh\u01b0 l\u00e0 ti\u00eau chu\u1ea9n.\n\n---\n\n# 3. S\u1eed d\u1ee5ng Log Level h\u1ee3p l\u00fd\n\nKh\u00f4ng ph\u1ea3i m\u1ecdi th\u00f4ng tin \u0111\u1ec1u n\u00ean \u0111\u01b0\u1ee3c ghi v\u1edbi m\u1ee9c **ERROR**.\n\nTh\u00f4ng th\u01b0\u1eddng, ch\u00fang ta s\u1eed d\u1ee5ng c\u00e1c m\u1ee9c sau:\n\n| Level | \u00dd ngh\u0129a                                                |\n| ----- | ------------------------------------------------------ |\n| TRACE | Th\u00f4ng tin r\u1ea5t chi ti\u1ebft, d\u00f9ng \u0111\u1ec3 debug                  |\n| DEBUG | Ph\u1ee5c v\u1ee5 qu\u00e1 tr\u00ecnh ph\u00e1t tri\u1ec3n                           |\n| INFO  | Ho\u1ea1t \u0111\u1ed9ng b\u00ecnh th\u01b0\u1eddng c\u1ee7a h\u1ec7 th\u1ed1ng                     |\n| WARN  | C\u00f3 d\u1ea5u hi\u1ec7u b\u1ea5t th\u01b0\u1eddng nh\u01b0ng ch\u01b0a g\u00e2y l\u1ed7i              |\n| ERROR | M\u1ed9t thao t\u00e1c th\u1ea5t b\u1ea1i nh\u01b0ng \u1ee9ng d\u1ee5ng v\u1eabn ti\u1ebfp t\u1ee5c ch\u1ea1y |\n\nV\u00ed d\u1ee5:\n\n```java\nlog.info(\"Application started\");\n\nlog.warn(\"Response time is above 2 seconds\");\n\nlog.error(\"Cannot connect to PostgreSQL\");\n```\n\nTrong m\u00f4i tr\u01b0\u1eddng Production:\n\n* TRACE v\u00e0 DEBUG th\u01b0\u1eddng b\u1ecb t\u1eaft.\n* INFO, WARN v\u00e0 ERROR \u0111\u01b0\u1ee3c gi\u1eef l\u1ea1i.\n\n\u0110i\u1ec1u n\u00e0y gi\u00fap gi\u1ea3m l\u01b0\u1ee3ng log c\u1ea7n l\u01b0u tr\u1eef.\n\n---\n\n# 4. Kh\u00f4ng ghi th\u00f4ng tin nh\u1ea1y c\u1ea3m v\u00e0o log\n\nM\u1ed9t trong nh\u1eefng l\u1ed7i nghi\u00eam tr\u1ecdng nh\u1ea5t l\u00e0 ghi d\u1eef li\u1ec7u nh\u1ea1y c\u1ea3m v\u00e0o log.\n\nV\u00ed d\u1ee5:\n\n```text\nPassword=123456\n\nJWT=eyJhbGciOi...\n\nCreditCard=4111111111111111\n```\n\nN\u1ebfu Loki ho\u1eb7c Grafana b\u1ecb truy c\u1eadp tr\u00e1i ph\u00e9p, c\u00e1c d\u1eef li\u1ec7u n\u00e0y c\u00f3 th\u1ec3 b\u1ecb l\u1ed9.\n\nNh\u1eefng th\u00f4ng tin **kh\u00f4ng n\u00ean ghi v\u00e0o log** bao g\u1ed3m:\n\n* M\u1eadt kh\u1ea9u.\n* Access Token.\n* Refresh Token.\n* API Key.\n* S\u1ed1 th\u1ebb t\u00edn d\u1ee5ng.\n* M\u00e3 OTP.\n* D\u1eef li\u1ec7u c\u00e1 nh\u00e2n kh\u00f4ng c\u1ea7n thi\u1ebft.\n\nThay v\u00ec:\n\n```text\nLogin failed\n\npassword=123456\n```\n\nH\u00e3y ghi:\n\n```text\nLogin failed\n\nusername=admin\n```\n\nho\u1eb7c:\n\n```text\nAuthentication failed\n```\n\n\u0110\u1ea3m b\u1ea3o log ch\u1ec9 ch\u1ee9a nh\u1eefng th\u00f4ng tin c\u1ea7n thi\u1ebft cho vi\u1ec7c \u0111i\u1ec1u tra s\u1ef1 c\u1ed1.\n\n---\n\n# 5. G\u1eafn Correlation ID cho m\u1ed7i Request\n\nTrong h\u1ec7 th\u1ed1ng Microservices, m\u1ed9t Request c\u00f3 th\u1ec3 \u0111i qua nhi\u1ec1u Service.\n\nV\u00ed d\u1ee5:\n\n```text\nFrontend\n\n\u2193\n\nAPI Gateway\n\n\u2193\n\nTodo Service\n\n\u2193\n\nUser Service\n\n\u2193\n\nNotification Service\n```\n\nN\u1ebfu kh\u00f4ng c\u00f3 Correlation ID, r\u1ea5t kh\u00f3 x\u00e1c \u0111\u1ecbnh c\u00e1c log thu\u1ed9c c\u00f9ng m\u1ed9t Request.\n\nGi\u1ea3i ph\u00e1p l\u00e0 sinh m\u1ed9t ID duy nh\u1ea5t.\n\nV\u00ed d\u1ee5:\n\n```text\nrequestId=9f4d62c1\n```\n\nM\u1ecdi Service \u0111\u1ec1u ghi c\u00f9ng ID n\u00e0y.\n\nV\u00ed d\u1ee5:\n\n```text\nINFO requestId=9f4d62c1 Call User Service\n\nINFO requestId=9f4d62c1 Query Database\n\nERROR requestId=9f4d62c1 Timeout PostgreSQL\n```\n\nKhi t\u00ecm ki\u1ebfm:\n\n```text\n9f4d62c1\n```\n\nGrafana s\u1ebd hi\u1ec3n th\u1ecb to\u00e0n b\u1ed9 h\u00e0nh tr\u00ecnh c\u1ee7a Request.\n\n\u0110\u00e2y l\u00e0 k\u1ef9 thu\u1eadt r\u1ea5t ph\u1ed5 bi\u1ebfn trong c\u00e1c h\u1ec7 th\u1ed1ng Microservices.\n\n---\n\n# 6. Kh\u00f4ng ghi qu\u00e1 nhi\u1ec1u log\n\nLog kh\u00f4ng ph\u1ea3i c\u00e0ng nhi\u1ec1u c\u00e0ng t\u1ed1t.\n\nV\u00ed d\u1ee5:\n\n```java\nfor (...) {\n\n    log.info(\"Loop\");\n\n}\n```\n\nN\u1ebfu v\u00f2ng l\u1eb7p ch\u1ea1y 100.000 l\u1ea7n, h\u1ec7 th\u1ed1ng s\u1ebd sinh 100.000 d\u00f2ng log.\n\nH\u1eadu qu\u1ea3:\n\n* T\u0103ng dung l\u01b0\u1ee3ng l\u01b0u tr\u1eef.\n* Gi\u1ea3m hi\u1ec7u n\u0103ng.\n* Kh\u00f3 t\u00ecm th\u00f4ng tin quan tr\u1ecdng.\n\nH\u00e3y ch\u1ec9 ghi log khi th\u1ef1c s\u1ef1 c\u1ea7n thi\u1ebft.\n\n---\n\n# 7. Ghi log \u0111\u1ee7 ng\u1eef c\u1ea3nh\n\nM\u1ed9t log t\u1ed1t c\u1ea7n tr\u1ea3 l\u1eddi \u0111\u01b0\u1ee3c c\u00e1c c\u00e2u h\u1ecfi:\n\n* C\u00f3 chuy\u1ec7n g\u00ec x\u1ea3y ra?\n* X\u1ea3y ra \u1edf \u0111\u00e2u?\n* V\u1edbi Request n\u00e0o?\n* V\u1edbi API n\u00e0o?\n\nV\u00ed d\u1ee5 ch\u01b0a t\u1ed1t:\n\n```text\nDatabase Error\n```\n\nV\u00ed d\u1ee5 t\u1ed1t h\u01a1n:\n\n```text\nPOST \/api\/todos\n\nDatabase connection timeout\n\nuserId=15\n```\n\nC\u00e0ng nhi\u1ec1u ng\u1eef c\u1ea3nh ph\u00f9 h\u1ee3p, vi\u1ec7c \u0111i\u1ec1u tra s\u1ef1 c\u1ed1 c\u00e0ng nhanh.\n\n---\n\n# 8. Thi\u1ebft l\u1eadp th\u1eddi gian l\u01b0u tr\u1eef Log\n\nKh\u00f4ng ph\u1ea3i log n\u00e0o c\u0169ng c\u1ea7n l\u01b0u m\u00e3i m\u00e3i.\n\nV\u00ed d\u1ee5:\n\n| M\u00f4i tr\u01b0\u1eddng  | Th\u1eddi gian l\u01b0u            |\n| ----------- | ------------------------ |\n| Development | 3\u20137 ng\u00e0y                 |\n| Staging     | 7\u201314 ng\u00e0y                |\n| Production  | 30\u201390 ng\u00e0y (t\u00f9y y\u00eau c\u1ea7u) |\n\nN\u1ebfu l\u01b0u log qu\u00e1 l\u00e2u:\n\n* T\u0103ng chi ph\u00ed l\u01b0u tr\u1eef.\n* Gi\u1ea3m hi\u1ec7u n\u0103ng truy v\u1ea5n.\n\nLoki h\u1ed7 tr\u1ee3 c\u1ea5u h\u00ecnh **Retention** \u0111\u1ec3 t\u1ef1 \u0111\u1ed9ng x\u00f3a log c\u0169 theo ch\u00ednh s\u00e1ch c\u1ee7a t\u1ed5 ch\u1ee9c.\n\n---\n\n# 9. S\u1eed d\u1ee5ng Label h\u1ee3p l\u00fd\n\nLoki t\u00ecm ki\u1ebfm d\u1ef1a tr\u00ean **Label**.\n\nV\u00ed d\u1ee5:\n\n```text\nnamespace=\"todo-app\"\n\napp=\"todo-backend\"\n\ncontainer=\"backend\"\n\nenvironment=\"production\"\n```\n\nC\u00e1c Label n\u00ean:\n\n* \u1ed4n \u0111\u1ecbnh theo th\u1eddi gian.\n* C\u00f3 s\u1ed1 l\u01b0\u1ee3ng gi\u00e1 tr\u1ecb gi\u1edbi h\u1ea1n.\n* Ph\u1ea3n \u00e1nh th\u00f4ng tin quan tr\u1ecdng \u0111\u1ec3 l\u1ecdc log.\n\nKh\u00f4ng n\u00ean s\u1eed d\u1ee5ng c\u00e1c gi\u00e1 tr\u1ecb thay \u0111\u1ed5i li\u00ean t\u1ee5c (high cardinality) nh\u01b0:\n\n```text\nrequestId\n\nsessionId\n\nuserId\n```\n\nl\u00e0m Label, v\u00ec s\u1ebd l\u00e0m t\u0103ng s\u1ed1 l\u01b0\u1ee3ng Log Stream v\u00e0 \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn hi\u1ec7u n\u0103ng c\u1ee7a Loki.\n\nNh\u1eefng th\u00f4ng tin n\u00e0y n\u00ean n\u1eb1m trong **n\u1ed9i dung log**, kh\u00f4ng ph\u1ea3i trong Label.\n\n---\n\n# 10. Quy tr\u00ecnh x\u1eed l\u00fd s\u1ef1 c\u1ed1 trong Production\n\n\u0110\u1ebfn \u0111\u00e2y, ch\u00fang ta \u0111\u00e3 c\u00f3 \u0111\u1ea7y \u0111\u1ee7 c\u00e1c c\u00f4ng c\u1ee5 c\u1ea7n thi\u1ebft.\n\nM\u1ed9t quy tr\u00ecnh x\u1eed l\u00fd s\u1ef1 c\u1ed1 \u0111i\u1ec3n h\u00ecnh s\u1ebd nh\u01b0 sau:\n\n```text\n                 Ng\u01b0\u1eddi d\u00f9ng b\u00e1o l\u1ed7i\n                        \u2502\n                        \u25bc\n              Alertmanager g\u1eedi c\u1ea3nh b\u00e1o\n                        \u2502\n                        \u25bc\n             Ki\u1ec3m tra Grafana Dashboard\n                        \u2502\n                        \u25bc\n          Ph\u00e1t hi\u1ec7n Metrics b\u1ea5t th\u01b0\u1eddng\n                        \u2502\n                        \u25bc\n              M\u1edf Grafana Explore\n                        \u2502\n                        \u25bc\n             Truy v\u1ea5n Log b\u1eb1ng LogQL\n                        \u2502\n                        \u25bc\n             X\u00e1c \u0111\u1ecbnh Root Cause\n                        \u2502\n                        \u25bc\n              Kh\u1eafc ph\u1ee5c s\u1ef1 c\u1ed1\n                        \u2502\n                        \u25bc\n               Alert chuy\u1ec3n Resolved\n```\n\n\u0110\u00e2y c\u0169ng ch\u00ednh l\u00e0 quy tr\u00ecnh m\u00e0 nhi\u1ec1u \u0111\u1ed9i ng\u0169 DevOps s\u1eed d\u1ee5ng trong th\u1ef1c t\u1ebf.\n\n---\n\n# T\u1ed5ng k\u1ebft Lab 9\n\nSau Lab 9, ch\u00fang ta \u0111\u00e3 ho\u00e0n thi\u1ec7n m\u1ea3nh gh\u00e9p cu\u1ed1i c\u00f9ng c\u1ee7a Observability.\n\n```text\n             Kubernetes Cluster\n                     \u2502\n                     \u25bc\n              Spring Boot App\n                     \u2502\n        \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n        \u2502            \u2502            \u2502\n        \u25bc            \u25bc            \u25bc\n    Metrics        Logs        Alerts\n        \u2502            \u2502            \u2502\n        \u25bc            \u25bc            \u25bc\n Prometheus       Loki     Alertmanager\n        \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                     \u25bc\n                  Grafana\n                     \u2502\n                     \u25bc\n          DevOps & SRE Team\n```\n\nH\u1ec7 th\u1ed1ng gi\u1edd \u0111\u00e2y c\u00f3 th\u1ec3:\n\n* Theo d\u00f5i hi\u1ec7u n\u0103ng c\u1ee7a \u1ee9ng d\u1ee5ng.\n* Ch\u1ee7 \u0111\u1ed9ng g\u1eedi c\u1ea3nh b\u00e1o khi c\u00f3 b\u1ea5t th\u01b0\u1eddng.\n* Thu th\u1eadp v\u00e0 t\u00ecm ki\u1ebfm log t\u1eadp trung.\n* \u0110i\u1ec1u tra nguy\u00ean nh\u00e2n g\u1ed1c c\u1ee7a s\u1ef1 c\u1ed1.\n* H\u1ed7 tr\u1ee3 qu\u00e1 tr\u00ecnh v\u1eadn h\u00e0nh trong m\u00f4i tr\u01b0\u1eddng Production.\n\n---\n\n# Nh\u1eefng g\u00ec b\u1ea1n \u0111\u00e3 h\u1ecdc\n\nSau Lab 9, b\u1ea1n \u0111\u00e3 bi\u1ebft:\n\n* \u2705 Ki\u1ebfn tr\u00fac Logging trong Kubernetes.\n* \u2705 Fluent Bit v\u00e0 c\u00e1ch thu th\u1eadp log.\n* \u2705 Loki v\u00e0 c\u01a1 ch\u1ebf l\u01b0u tr\u1eef log.\n* \u2705 K\u1ebft n\u1ed1i Grafana v\u1edbi Loki.\n* \u2705 Truy v\u1ea5n log b\u1eb1ng LogQL.\n* \u2705 \u0110i\u1ec1u tra s\u1ef1 c\u1ed1 b\u1eb1ng Metrics, Alerts v\u00e0 Logs.\n* \u2705 C\u00e1c Best Practices khi ghi log trong Kubernetes.\n* \u2705 Quy tr\u00ecnh x\u1eed l\u00fd s\u1ef1 c\u1ed1 trong m\u00f4i tr\u01b0\u1eddng Production.\n\n---\n\n# B\u00e0i h\u1ecdc r\u00fat ra\n\nQua ch\u00edn b\u00e0i Lab, ch\u00fang ta \u0111\u00e3 x\u00e2y d\u1ef1ng t\u1eebng b\u01b0\u1edbc m\u1ed9t h\u1ec7 th\u1ed1ng Kubernetes t\u1eeb m\u00f4i tr\u01b0\u1eddng ph\u00e1t tri\u1ec3n \u0111\u01a1n gi\u1ea3n \u0111\u1ebfn m\u1ed9t n\u1ec1n t\u1ea3ng c\u00f3 kh\u1ea3 n\u0103ng v\u1eadn h\u00e0nh trong Production.\n\nT\u1eeb vi\u1ec7c tri\u1ec3n khai \u1ee9ng d\u1ee5ng, t\u1ed1i \u01b0u t\u00e0i nguy\u00ean, t\u1ef1 \u0111\u1ed9ng m\u1edf r\u1ed9ng, gi\u00e1m s\u00e1t, c\u1ea3nh b\u00e1o cho \u0111\u1ebfn thu th\u1eadp log t\u1eadp trung, m\u1ed7i th\u00e0nh ph\u1ea7n \u0111\u1ec1u \u0111\u00f3ng vai tr\u00f2 quan tr\u1ecdng trong vi\u1ec7c \u0111\u1ea3m b\u1ea3o h\u1ec7 th\u1ed1ng ho\u1ea1t \u0111\u1ed9ng \u1ed5n \u0111\u1ecbnh.\n\n**Metrics** gi\u00fap ch\u00fang ta bi\u1ebft h\u1ec7 th\u1ed1ng \u0111ang ho\u1ea1t \u0111\u1ed9ng nh\u01b0 th\u1ebf n\u00e0o.\n\n**Alerts** gi\u00fap ch\u00fang ta bi\u1ebft khi n\u00e0o c\u1ea7n h\u00e0nh \u0111\u1ed9ng.\n\n**Logs** gi\u00fap ch\u00fang ta hi\u1ec3u nguy\u00ean nh\u00e2n th\u1ef1c s\u1ef1 c\u1ee7a s\u1ef1 c\u1ed1.\n\nKhi k\u1ebft h\u1ee3p ba th\u00e0nh ph\u1ea7n n\u00e0y, ch\u00fang ta c\u00f3 m\u1ed9t h\u1ec7 th\u1ed1ng **Observability** ho\u00e0n ch\u1ec9nh, gi\u00fap DevOps v\u00e0 Developer r\u00fat ng\u1eafn th\u1eddi gian ph\u00e1t hi\u1ec7n, \u0111i\u1ec1u tra v\u00e0 kh\u1eafc ph\u1ee5c s\u1ef1 c\u1ed1, \u0111\u1ed3ng th\u1eddi n\u00e2ng cao \u0111\u1ed9 tin c\u1eady c\u1ee7a c\u00e1c \u1ee9ng d\u1ee5ng ch\u1ea1y tr\u00ean Kubernetes. \u0110\u00e2y c\u0169ng l\u00e0 n\u1ec1n t\u1ea3ng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng r\u1ed9ng r\u00e3i trong c\u00e1c h\u1ec7 th\u1ed1ng Cloud Native v\u00e0 Kubernetes Production hi\u1ec7n nay.","published_at":"2026-08-05T11:21:24.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T19:07:02.000000Z","edited_at":"2026-08-05T11:20:35.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":9,"points":0,"views_count":10,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/6a6bf66d-11b4-426b-8f63-757b631d6656.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":59,"reputation":1181,"posts_count":100,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"centralized-logging","name":"centralized logging"},{"slug":"fluent-bit","name":"Fluent Bit"},{"slug":"grafana","name":"grafana"},{"slug":"kubernetes","name":"Kubernetes"},{"slug":"loki","name":"Loki"}]},"commentators":{"data":[]}},{"id":104820,"title":"Lab 9.5 - X\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng Centralized Logging v\u1edbi Fluent Bit, Loki v\u00e0 Grafana","slug":"G24B8mjWLz3","url":"https:\/\/viblo.asia\/p\/lab-95-xay-dung-he-thong-centralized-logging-voi-fluent-bit-loki-va-grafana-G24B8mjWLz3","user_id":98940,"moderation":null,"transliterated":"lab-95-xay-dung-he-thong-centralized-logging-voi-fluent-bit-loki-va-grafana","contents_short":"Ph\u1ea7n 5 - \u0110i\u1ec1u tra s\u1ef1 c\u1ed1 th\u1ef1c t\u1ebf v\u1edbi Metrics, Alerts v\u00e0 Logs\n\n\u0110\u1ebfn th\u1eddi \u0111i\u1ec3m n\u00e0y, ch\u00fang ta \u0111\u00e3 x\u00e2y d\u1ef1ng \u0111\u01b0\u1ee3c m\u1ed9t h\u1ec7 th\u1ed1ng Observability g\u1ea7n nh\u01b0 ho\u00e0n ch\u1ec9nh:\n\n* Prometheus thu th\u1eadp Metrics.\n* Grafana hi\u1ec3n th\u1ecb Dashboard.\n* Alertmanager g\u1eedi c\u1ea3nh b\u00e1o.\n* Fluent Bit thu th\u1eadp log.\n* Loki l\u01b0u tr\u1eef log.\n\nNh\u01b0ng m\u1ed9t c\u00e2u h\u1ecfi quan tr\u1ecdng v\u1eabn c\u00f2n b\u1ecf ng\u1ecf:\n\nL\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 s\u1eed d\u1ee5ng t\u1ea5t c\u1ea3 nh\u1eefng c\u00f4ng c\u1ee5 n\u00e0y \u0111\u1ec3 \u0111i\u1ec1u tra...","contents":"# Ph\u1ea7n 5 - \u0110i\u1ec1u tra s\u1ef1 c\u1ed1 th\u1ef1c t\u1ebf v\u1edbi Metrics, Alerts v\u00e0 Logs\n\n\u0110\u1ebfn th\u1eddi \u0111i\u1ec3m n\u00e0y, ch\u00fang ta \u0111\u00e3 x\u00e2y d\u1ef1ng \u0111\u01b0\u1ee3c m\u1ed9t h\u1ec7 th\u1ed1ng Observability g\u1ea7n nh\u01b0 ho\u00e0n ch\u1ec9nh:\n\n* **Prometheus** thu th\u1eadp Metrics.\n* **Grafana** hi\u1ec3n th\u1ecb Dashboard.\n* **Alertmanager** g\u1eedi c\u1ea3nh b\u00e1o.\n* **Fluent Bit** thu th\u1eadp log.\n* **Loki** l\u01b0u tr\u1eef log.\n\nNh\u01b0ng m\u1ed9t c\u00e2u h\u1ecfi quan tr\u1ecdng v\u1eabn c\u00f2n b\u1ecf ng\u1ecf:\n\n> **L\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 s\u1eed d\u1ee5ng t\u1ea5t c\u1ea3 nh\u1eefng c\u00f4ng c\u1ee5 n\u00e0y \u0111\u1ec3 \u0111i\u1ec1u tra m\u1ed9t s\u1ef1 c\u1ed1 th\u1ef1c t\u1ebf?**\n\nTrong ph\u1ea7n n\u00e0y, ch\u00fang ta s\u1ebd m\u00f4 ph\u1ecfng m\u1ed9t s\u1ef1 c\u1ed1 Production tr\u00ean h\u1ec7 th\u1ed1ng Todo v\u00e0 \u0111i qua to\u00e0n b\u1ed9 quy tr\u00ecnh m\u00e0 m\u1ed9t DevOps Engineer th\u01b0\u1eddng th\u1ef1c hi\u1ec7n.\n\n---\n\n# M\u1ee5c ti\u00eau c\u1ee7a ph\u1ea7n n\u00e0y\n\nSau khi ho\u00e0n th\u00e0nh ph\u1ea7n n\u00e0y, b\u1ea1n s\u1ebd:\n\n* Hi\u1ec3u quy tr\u00ecnh x\u1eed l\u00fd s\u1ef1 c\u1ed1 trong Production.\n* K\u1ebft h\u1ee3p Alert, Metrics v\u00e0 Logs.\n* S\u1eed d\u1ee5ng LogQL \u0111\u1ec3 t\u00ecm nguy\u00ean nh\u00e2n g\u1ed1c (Root Cause).\n* Debug \u1ee9ng d\u1ee5ng thay v\u00ec ch\u1ec9 quan s\u00e1t Dashboard.\n\n---\n\n# T\u00ecnh hu\u1ed1ng th\u1ef1c t\u1ebf\n\nM\u1ed9t bu\u1ed5i s\u00e1ng th\u1ee9 Hai, Product Owner g\u1eedi tin nh\u1eafn:\n\n> **\"Ng\u01b0\u1eddi d\u00f9ng ph\u1ea3n \u00e1nh API t\u1ea1o Todo r\u1ea5t ch\u1eadm, th\u1ec9nh tho\u1ea3ng c\u00f2n b\u00e1o l\u1ed7i.\"**\n\n\u0110\u1ed3ng th\u1eddi, DevOps nh\u1eadn \u0111\u01b0\u1ee3c Email t\u1eeb Alertmanager:\n\n```text\n\ud83d\udea8 ALERT\n\nAlert Name:\nHighHTTP5xxRate\n\nSeverity:\nCritical\n\nService:\ntodo-api\n\nNamespace:\ntodo-app\n```\n\n\u0110\u00e2y l\u00e0 l\u00fac quy tr\u00ecnh \u0111i\u1ec1u tra b\u1eaft \u0111\u1ea7u.\n\n---\n\n# B\u01b0\u1edbc 1. Ki\u1ec3m tra Dashboard\n\nM\u1edf Grafana Dashboard \u0111\u00e3 t\u1ea1o \u1edf Lab 7.\n\nQuan s\u00e1t c\u00e1c Metrics:\n\n```text\nCPU\n\u2193\n\n32%\n```\n\n```text\nMemory\n\u2193\n\n55%\n```\n\n```text\nRequest Rate\n\u2193\n\n120 req\/s\n```\n\n```text\nRequest Latency\n\u2193\n\n4.8 s\n```\n\n```text\nHTTP 500\n\u2193\n\nT\u0103ng li\u00ean t\u1ee5c\n```\n\nT\u1eeb Dashboard ch\u00fang ta nh\u1eadn th\u1ea5y:\n\n* CPU kh\u00f4ng cao.\n* Memory c\u00f2n nhi\u1ec1u.\n* Request Rate b\u00ecnh th\u01b0\u1eddng.\n* Nh\u01b0ng Latency v\u00e0 HTTP 500 t\u0103ng m\u1ea1nh.\n\n\u0110i\u1ec1u n\u00e0y cho th\u1ea5y:\n\n> **\u1ee8ng d\u1ee5ng v\u1eabn ho\u1ea1t \u0111\u1ed9ng nh\u01b0ng \u0111ang g\u1eb7p l\u1ed7i b\u00ean trong.**\n\nDashboard gi\u00fap x\u00e1c \u0111\u1ecbnh **\u0111i\u1ec1u g\u00ec \u0111ang x\u1ea3y ra**, nh\u01b0ng ch\u01b0a th\u1ec3 cho bi\u1ebft nguy\u00ean nh\u00e2n.\n\n---\n\n# B\u01b0\u1edbc 2. Ki\u1ec3m tra Alert\n\nM\u1edf:\n\n```text\nAlerting\n\n\u2193\n\nAlert Rules\n```\n\nHo\u1eb7c:\n\n```text\nAlertmanager\n```\n\nQuan s\u00e1t:\n\n```text\nHighHTTP5xxRate\n\nStatus\n\nFIRING\n```\n\nTh\u00f4ng tin Alert:\n\n```text\nStarted\n\n08:15\n\nSeverity\n\nCritical\n\nNamespace\n\ntodo-app\n\nService\n\ntodo-api\n```\n\nNh\u1edd Alert, DevOps bi\u1ebft:\n\n* L\u1ed7i v\u1eabn \u0111ang ti\u1ebfp di\u1ec5n.\n* Kh\u00f4ng ph\u1ea3i s\u1ef1 c\u1ed1 \u0111\u00e3 x\u1ea3y ra r\u1ed3i t\u1ef1 bi\u1ebfn m\u1ea5t.\n* C\u1ea7n \u0111i\u1ec1u tra ngay.\n\n---\n\n# B\u01b0\u1edbc 3. Chuy\u1ec3n sang Logs\n\nM\u1edf:\n\n```text\nGrafana\n\n\u2193\n\nExplore\n\n\u2193\n\nLoki\n```\n\nCh\u00fang ta ch\u1ec9 mu\u1ed1n xem log c\u1ee7a Backend:\n\n```logql\n{namespace=\"todo-app\"}\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nINFO Application started\n\nGET \/api\/todos\n\nPOST \/api\/todos\n\nERROR Database timeout\n```\n\nNgay l\u1eadp t\u1ee9c ch\u00fang ta \u0111\u00e3 th\u1ea5y nhi\u1ec1u log ERROR.\n\n---\n\n# B\u01b0\u1edbc 4. Ch\u1ec9 l\u1ea5y log l\u1ed7i\n\nThay v\u00ec xem t\u1ea5t c\u1ea3 log, l\u1ecdc ri\u00eang log ch\u1ee9a t\u1eeb kh\u00f3a **ERROR**.\n\n```logql\n{namespace=\"todo-app\"} |= \"ERROR\"\n```\n\nV\u00ed d\u1ee5:\n\n```text\nERROR Database connection timeout\n\nERROR Cannot get JDBC Connection\n\nERROR Transaction rollback\n\nERROR Failed to execute SQL\n```\n\nL\u01b0\u1ee3ng log \u0111\u00e3 gi\u1ea3m r\u1ea5t nhi\u1ec1u.\n\nDevOps ch\u1ec9 c\u1ea7n t\u1eadp trung v\u00e0o nh\u1eefng d\u00f2ng th\u1ef1c s\u1ef1 quan tr\u1ecdng.\n\n---\n\n# B\u01b0\u1edbc 5. X\u00e1c \u0111\u1ecbnh nguy\u00ean nh\u00e2n\n\nQuan s\u00e1t k\u1ef9 h\u01a1n:\n\n```text\nERROR\n\norg.postgresql.util.PSQLException\n\nConnection timed out\n```\n\nHo\u1eb7c:\n\n```text\nERROR\n\nHikariPool\n\nConnection is not available\n```\n\n\u0110\u1ebfn \u0111\u00e2y ch\u00fang ta \u0111\u00e3 c\u00f3 manh m\u1ed1i.\n\n\u1ee8ng d\u1ee5ng kh\u00f4ng b\u1ecb l\u1ed7i v\u00ec:\n\n* CPU.\n* Memory.\n* Kubernetes.\n\nM\u00e0 v\u00ec:\n\n> **Backend kh\u00f4ng l\u1ea5y \u0111\u01b0\u1ee3c k\u1ebft n\u1ed1i t\u1edbi PostgreSQL.**\n\n\u0110\u00e2y ch\u00ednh l\u00e0 **Root Cause**.\n\n---\n\n# B\u01b0\u1edbc 6. Ki\u1ec3m tra PostgreSQL\n\nQuay l\u1ea1i Kubernetes:\n\n```bash\nkubectl get pods -n todo-app\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME\n\ntodo-postgres\n\nRunning\n```\n\nPod v\u1eabn ch\u1ea1y.\n\nKi\u1ec3m tra ti\u1ebfp:\n\n```bash\nkubectl logs \\\ntodo-postgres \\\n-n todo-app\n```\n\nV\u00ed d\u1ee5:\n\n```text\nFATAL\n\nremaining connection slots are reserved\n```\n\nHo\u1eb7c:\n\n```text\ntoo many connections\n```\n\nL\u00fac n\u00e0y nguy\u00ean nh\u00e2n \u0111\u00e3 r\u00f5 r\u00e0ng:\n\n\u1ee8ng d\u1ee5ng t\u1ea1o qu\u00e1 nhi\u1ec1u k\u1ebft n\u1ed1i t\u1edbi Database khi\u1ebfn PostgreSQL t\u1eeb ch\u1ed1i k\u1ebft n\u1ed1i m\u1edbi.\n\n---\n\n# B\u01b0\u1edbc 7. \u0110\u1ed1i chi\u1ebfu Metrics\n\nQuay l\u1ea1i Dashboard.\n\nQuan s\u00e1t:\n\n```text\nCPU\n\n30%\n```\n\n```text\nMemory\n\n50%\n```\n\nKh\u00f4ng c\u00f3 g\u00ec b\u1ea5t th\u01b0\u1eddng.\n\n\u0110i\u1ec1u n\u00e0y ch\u1ee9ng minh:\n\n> **Kh\u00f4ng ph\u1ea3i m\u1ecdi s\u1ef1 c\u1ed1 \u0111\u1ec1u th\u1ec3 hi\u1ec7n qua CPU ho\u1eb7c Memory.**\n\nN\u1ebfu ch\u1ec9 nh\u00ecn Dashboard Infrastructure, r\u1ea5t kh\u00f3 ph\u00e1t hi\u1ec7n v\u1ea5n \u0111\u1ec1.\n\n---\n\n# B\u01b0\u1edbc 8. Kh\u1eafc ph\u1ee5c s\u1ef1 c\u1ed1\n\nSau khi x\u00e1c \u0111\u1ecbnh nguy\u00ean nh\u00e2n, DevOps c\u00f3 th\u1ec3:\n\n* T\u0103ng k\u00edch th\u01b0\u1edbc Connection Pool.\n* Ki\u1ec3m tra Connection Leak.\n* T\u1ed1i \u01b0u Transaction.\n* Kh\u1edfi \u0111\u1ed9ng l\u1ea1i Database n\u1ebfu c\u1ea7n.\n\nSau khi kh\u1eafc ph\u1ee5c:\n\nDashboard:\n\n```text\nLatency\n\n4.8 s\n\n\u2193\n\n120 ms\n```\n\nHTTP 500:\n\n```text\n85\/min\n\n\u2193\n\n0\/min\n```\n\nAlert:\n\n```text\nResolved\n```\n\nH\u1ec7 th\u1ed1ng ho\u1ea1t \u0111\u1ed9ng b\u00ecnh th\u01b0\u1eddng tr\u1edf l\u1ea1i.\n\n---\n\n# M\u00f4 ph\u1ecfng m\u1ed9t s\u1ef1 c\u1ed1 kh\u00e1c\n\nCh\u00fang ta s\u1ebd th\u1eed t\u1ea1o l\u1ed7i \u0111\u1ec3 quan s\u00e1t to\u00e0n b\u1ed9 quy tr\u00ecnh.\n\n## T\u1eaft PostgreSQL\n\n```bash\nkubectl scale deployment todo-postgres \\\n--replicas=0 \\\n-n todo-app\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get pods -n todo-app\n```\n\nB\u1ea1n s\u1ebd th\u1ea5y Pod PostgreSQL bi\u1ebfn m\u1ea5t.\n\n---\n\n# G\u1eedi Request\n\n```bash\ncurl http:\/\/localhost:8080\/api\/todos\n```\n\n\u1ee8ng d\u1ee5ng s\u1ebd tr\u1ea3 v\u1ec1 l\u1ed7i.\n\nV\u00ed d\u1ee5:\n\n```text\nHTTP\/1.1 500\n```\n\n---\n\n# Quan s\u00e1t Dashboard\n\nRequest Latency t\u0103ng.\n\nHTTP 500 t\u0103ng.\n\nRequest Rate gi\u1ea3m.\n\n---\n\n# Quan s\u00e1t Alert\n\nSau kho\u1ea3ng th\u1eddi gian c\u1ea5u h\u00ecnh (`for: 2m` ho\u1eb7c `for: 5m`), Alert chuy\u1ec3n sang:\n\n```text\nPending\n\n\u2193\n\nFiring\n```\n\nAlertmanager g\u1eedi Email ho\u1eb7c Slack.\n\n---\n\n# Quan s\u00e1t Logs\n\nM\u1edf Grafana.\n\nQuery:\n\n```logql\n{namespace=\"todo-app\"} |= \"ERROR\"\n```\n\nV\u00ed d\u1ee5:\n\n```text\nERROR\n\nConnection refused\n\npostgres:5432\n```\n\nHo\u1eb7c:\n\n```text\nERROR\n\nFailed to connect to PostgreSQL\n```\n\nCh\u1ec9 trong v\u00e0i ph\u00fat, DevOps \u0111\u00e3 x\u00e1c \u0111\u1ecbnh \u0111\u01b0\u1ee3c nguy\u00ean nh\u00e2n.\n\n---\n\n# Kh\u00f4i ph\u1ee5c PostgreSQL\n\n```bash\nkubectl scale deployment todo-postgres \\\n--replicas=1 \\\n-n todo-app\n```\n\n\u0110\u1ee3i Pod Running:\n\n```bash\nkubectl get pods -n todo-app\n```\n\nSau v\u00e0i ph\u00fat:\n\n* HTTP 500 gi\u1ea3m.\n* Alert chuy\u1ec3n sang **Resolved**.\n* Logs kh\u00f4ng c\u00f2n xu\u1ea5t hi\u1ec7n l\u1ed7i m\u1edbi.\n\n---\n\n# Quy tr\u00ecnh \u0111i\u1ec1u tra s\u1ef1 c\u1ed1 ho\u00e0n ch\u1ec9nh\n\n\u0110\u00e2y l\u00e0 quy tr\u00ecnh m\u00e0 nhi\u1ec1u \u0111\u1ed9i ng\u0169 DevOps \u00e1p d\u1ee5ng trong m\u00f4i tr\u01b0\u1eddng Production.\n\n```text\n               Ng\u01b0\u1eddi d\u00f9ng b\u00e1o l\u1ed7i\n                       \u2502\n                       \u25bc\n             Alertmanager g\u1eedi c\u1ea3nh b\u00e1o\n                       \u2502\n                       \u25bc\n             Ki\u1ec3m tra Grafana Dashboard\n                       \u2502\n                       \u25bc\n         X\u00e1c \u0111\u1ecbnh Metrics b\u1ea5t th\u01b0\u1eddng\n                       \u2502\n                       \u25bc\n              M\u1edf Grafana Explore\n                       \u2502\n                       \u25bc\n              Truy v\u1ea5n Log b\u1eb1ng Loki\n                       \u2502\n                       \u25bc\n              T\u00ecm Root Cause\n                       \u2502\n                       \u25bc\n             Kh\u1eafc ph\u1ee5c s\u1ef1 c\u1ed1\n                       \u2502\n                       \u25bc\n              Alert chuy\u1ec3n Resolved\n```\n\n---\n\n# Metrics, Alerts v\u00e0 Logs b\u1ed5 sung cho nhau nh\u01b0 th\u1ebf n\u00e0o?\n\n| Th\u00e0nh ph\u1ea7n  | Tr\u1ea3 l\u1eddi c\u00e2u h\u1ecfi                      |\n| ----------- | ------------------------------------ |\n| **Metrics** | H\u1ec7 th\u1ed1ng \u0111ang ho\u1ea1t \u0111\u1ed9ng nh\u01b0 th\u1ebf n\u00e0o? |\n| **Alerts**  | Khi n\u00e0o c\u1ea7n h\u00e0nh \u0111\u1ed9ng?               |\n| **Logs**    | Nguy\u00ean nh\u00e2n c\u1ee7a s\u1ef1 c\u1ed1 l\u00e0 g\u00ec?         |\n\nKh\u00f4ng c\u00f3 th\u00e0nh ph\u1ea7n n\u00e0o c\u00f3 th\u1ec3 thay th\u1ebf ho\u00e0n to\u00e0n th\u00e0nh ph\u1ea7n c\u00f2n l\u1ea1i.\n\nCh\u1ec9 khi k\u1ebft h\u1ee3p c\u1ea3 ba, ch\u00fang ta m\u1edbi c\u00f3 th\u1ec3 \u0111i\u1ec1u tra v\u00e0 x\u1eed l\u00fd s\u1ef1 c\u1ed1 m\u1ed9t c\u00e1ch hi\u1ec7u qu\u1ea3.\n\n---\n\n# K\u1ebft qu\u1ea3 \u0111\u1ea1t \u0111\u01b0\u1ee3c\n\nSau ph\u1ea7n n\u00e0y, b\u1ea1n \u0111\u00e3 bi\u1ebft c\u00e1ch:\n\n* \u0110i\u1ec1u tra m\u1ed9t s\u1ef1 c\u1ed1 Production t\u1eeb \u0111\u1ea7u \u0111\u1ebfn cu\u1ed1i.\n* K\u1ebft h\u1ee3p Dashboard, Alert v\u00e0 Logs.\n* S\u1eed d\u1ee5ng LogQL \u0111\u1ec3 t\u00ecm Root Cause.\n* Ph\u00e2n bi\u1ec7t vai tr\u00f2 c\u1ee7a Metrics, Alerts v\u00e0 Logs.\n* \u00c1p d\u1ee5ng quy tr\u00ecnh x\u1eed l\u00fd s\u1ef1 c\u1ed1 gi\u1ed1ng c\u00e1c \u0111\u1ed9i ng\u0169 DevOps trong th\u1ef1c t\u1ebf.\n\n\u0110\u1ebfn \u0111\u00e2y, ch\u00fang ta kh\u00f4ng ch\u1ec9 c\u00f3 m\u1ed9t h\u1ec7 th\u1ed1ng **Monitoring** hay **Logging** ri\u00eang l\u1ebb, m\u00e0 \u0111\u00e3 x\u00e2y d\u1ef1ng \u0111\u01b0\u1ee3c m\u1ed9t n\u1ec1n t\u1ea3ng **Observability** ho\u00e0n ch\u1ec9nh, n\u01a1i Metrics gi\u00fap ph\u00e1t hi\u1ec7n d\u1ea5u hi\u1ec7u b\u1ea5t th\u01b0\u1eddng, Alerts ch\u1ee7 \u0111\u1ed9ng th\u00f4ng b\u00e1o s\u1ef1 c\u1ed1 v\u00e0 Logs cung c\u1ea5p b\u1eb1ng ch\u1ee9ng \u0111\u1ec3 x\u00e1c \u0111\u1ecbnh nguy\u00ean nh\u00e2n g\u1ed1c c\u1ee7a v\u1ea5n \u0111\u1ec1. \u0110\u00e2y c\u0169ng ch\u00ednh l\u00e0 m\u1ee5c ti\u00eau cu\u1ed1i c\u00f9ng c\u1ee7a chu\u1ed7i **Kubernetes t\u1eeb Zero \u0111\u1ebfn Production**.","published_at":"2026-08-05T11:18:42.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T16:40:02.000000Z","edited_at":"2026-08-05T11:18:31.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":6,"points":0,"views_count":9,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/5ef2eeeb-1217-4159-82cd-0f79c3454b60.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":59,"reputation":1181,"posts_count":100,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"centralized-logging","name":"centralized logging"},{"slug":"fluent-bit","name":"Fluent Bit"},{"slug":"grafana","name":"grafana"},{"slug":"kubernetes","name":"Kubernetes"},{"slug":"loki","name":"Loki"}]},"commentators":{"data":[]}},{"id":104819,"title":"Lab 9.4 - X\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng Centralized Logging v\u1edbi Fluent Bit, Loki v\u00e0 Grafana","slug":"RlL5eDKPLbB","url":"https:\/\/viblo.asia\/p\/lab-94-xay-dung-he-thong-centralized-logging-voi-fluent-bit-loki-va-grafana-RlL5eDKPLbB","user_id":98940,"moderation":null,"transliterated":"lab-94-xay-dung-he-thong-centralized-logging-voi-fluent-bit-loki-va-grafana","contents_short":"Ph\u1ea7n 4 - K\u1ebft n\u1ed1i Loki v\u1edbi Grafana v\u00e0 truy v\u1ea5n Log \u0111\u1ea7u ti\u00ean\n\n\u0110\u1ebfn th\u1eddi \u0111i\u1ec3m n\u00e0y, ch\u00fang ta \u0111\u00e3 ho\u00e0n th\u00e0nh hai th\u00e0nh ph\u1ea7n quan tr\u1ecdng c\u1ee7a h\u1ec7 th\u1ed1ng Logging:\n\n* Loki \u0111\u1ec3 l\u01b0u tr\u1eef log.\n* Fluent Bit \u0111\u1ec3 thu th\u1eadp log t\u1eeb Kubernetes v\u00e0 g\u1eedi t\u1edbi Loki.\n\nTuy nhi\u00ean, vi\u1ec7c xem log th\u00f4ng qua kubectl logs ho\u1eb7c ki\u1ec3m tra log c\u1ee7a Loki v\u1eabn ch\u01b0a th\u1ef1c s\u1ef1 thu\u1eadn ti\u1ec7n.\n\nTrong m\u00f4i tr\u01b0\u1eddng Production, DevOps th\u01b0\u1eddng s\u1eed d\u1ee5ng Grafana...","contents":"# Ph\u1ea7n 4 - K\u1ebft n\u1ed1i Loki v\u1edbi Grafana v\u00e0 truy v\u1ea5n Log \u0111\u1ea7u ti\u00ean\n\n\u0110\u1ebfn th\u1eddi \u0111i\u1ec3m n\u00e0y, ch\u00fang ta \u0111\u00e3 ho\u00e0n th\u00e0nh hai th\u00e0nh ph\u1ea7n quan tr\u1ecdng c\u1ee7a h\u1ec7 th\u1ed1ng Logging:\n\n* **Loki** \u0111\u1ec3 l\u01b0u tr\u1eef log.\n* **Fluent Bit** \u0111\u1ec3 thu th\u1eadp log t\u1eeb Kubernetes v\u00e0 g\u1eedi t\u1edbi Loki.\n\nTuy nhi\u00ean, vi\u1ec7c xem log th\u00f4ng qua `kubectl logs` ho\u1eb7c ki\u1ec3m tra log c\u1ee7a Loki v\u1eabn ch\u01b0a th\u1ef1c s\u1ef1 thu\u1eadn ti\u1ec7n.\n\nTrong m\u00f4i tr\u01b0\u1eddng Production, DevOps th\u01b0\u1eddng s\u1eed d\u1ee5ng **Grafana** \u0111\u1ec3 t\u00ecm ki\u1ebfm, l\u1ecdc v\u00e0 ph\u00e2n t\u00edch log.\n\n\u1ede ph\u1ea7n n\u00e0y, ch\u00fang ta s\u1ebd k\u1ebft n\u1ed1i Grafana v\u1edbi Loki v\u00e0 th\u1ef1c hi\u1ec7n nh\u1eefng truy v\u1ea5n LogQL \u0111\u1ea7u ti\u00ean.\n\n---\n\n# M\u1ee5c ti\u00eau c\u1ee7a ph\u1ea7n n\u00e0y\n\nSau khi ho\u00e0n th\u00e0nh ph\u1ea7n n\u00e0y, b\u1ea1n s\u1ebd:\n\n* K\u1ebft n\u1ed1i Grafana v\u1edbi Loki.\n* Hi\u1ec3u Data Source trong Grafana.\n* Th\u1ef1c hi\u1ec7n truy v\u1ea5n LogQL \u0111\u1ea7u ti\u00ean.\n* T\u00ecm log theo Namespace.\n* T\u00ecm log theo Pod.\n* T\u00ecm log theo n\u1ed9i dung.\n* Hi\u1ec3u Label v\u00e0 Log Stream trong Loki.\n\n---\n\n# Ki\u1ebfn tr\u00fac sau khi ho\u00e0n th\u00e0nh\n\nSau ph\u1ea7n n\u00e0y, ki\u1ebfn tr\u00fac Logging s\u1ebd ho\u00e0n ch\u1ec9nh.\n\n```text\n              Spring Boot\n                    \u2502\n             stdout \/ stderr\n                    \u2502\n          \/var\/log\/containers\n                    \u2502\n               Fluent Bit\n                    \u2502\n                   Loki\n                    \u2502\n                 Grafana\n                    \u2502\n             Search Log\n```\n\nGrafana s\u1ebd \u0111\u00f3ng vai tr\u00f2 l\u00e0 giao di\u1ec7n \u0111\u1ec3 truy v\u1ea5n v\u00e0 ph\u00e2n t\u00edch log.\n\n---\n\n# B\u01b0\u1edbc 1. Truy c\u1eadp Grafana\n\nN\u1ebfu Grafana ch\u01b0a \u0111\u01b0\u1ee3c m\u1edf, th\u1ef1c hi\u1ec7n Port Forward:\n\n```bash\nkubectl port-forward svc\/grafana \\\n3000:80 \\\n-n monitoring\n```\n\nM\u1edf tr\u00ecnh duy\u1ec7t:\n\n```text\nhttp:\/\/localhost:3000\n```\n\n\u0110\u0103ng nh\u1eadp b\u1eb1ng t\u00e0i kho\u1ea3n \u0111\u00e3 t\u1ea1o \u1edf Lab 6.\n\n---\n\n# B\u01b0\u1edbc 2. Ki\u1ec3m tra Data Source\n\nTrong Grafana, ch\u1ecdn:\n\n```text\nConnections\n\n\u2193\n\nData Sources\n```\n\nN\u1ebfu b\u1ea1n c\u00e0i Loki b\u1eb1ng Helm Chart c\u00f3 t\u00edch h\u1ee3p s\u1eb5n v\u1edbi Grafana, Data Source Loki c\u00f3 th\u1ec3 \u0111\u00e3 \u0111\u01b0\u1ee3c t\u1ea1o t\u1ef1 \u0111\u1ed9ng.\n\nN\u1ebfu ch\u01b0a c\u00f3, ch\u00fang ta s\u1ebd th\u00eam th\u1ee7 c\u00f4ng.\n\n---\n\n# B\u01b0\u1edbc 3. Th\u00eam Data Source Loki\n\nCh\u1ecdn:\n\n```text\nAdd data source\n```\n\nCh\u1ecdn:\n\n```text\nLoki\n```\n\nNh\u1eadp \u0111\u1ecba ch\u1ec9:\n\n```text\nhttp:\/\/loki.logging.svc.cluster.local:3100\n```\n\nSau \u0111\u00f3 nh\u1ea5n:\n\n```text\nSave & Test\n```\n\nN\u1ebfu c\u1ea5u h\u00ecnh \u0111\u00fang, Grafana s\u1ebd hi\u1ec3n th\u1ecb:\n\n```text\nData source is working\n```\n\n\u0110i\u1ec1u n\u00e0y cho bi\u1ebft Grafana \u0111\u00e3 k\u1ebft n\u1ed1i th\u00e0nh c\u00f4ng t\u1edbi Loki.\n\n---\n\n# V\u00ec sao d\u00f9ng Service DNS?\n\nTrong Kubernetes, c\u00e1c Pod c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c t\u1ea1o m\u1edbi b\u1ea5t k\u1ef3 l\u00fac n\u00e0o.\n\nV\u00ed d\u1ee5:\n\n```text\nloki-0\n```\n\nb\u1ecb x\u00f3a.\n\nPod m\u1edbi s\u1ebd \u0111\u01b0\u1ee3c t\u1ea1o:\n\n```text\nloki-1\n```\n\n\u0110\u1ecba ch\u1ec9 IP c\u1ee7a Pod c\u00f3 th\u1ec3 thay \u0111\u1ed5i.\n\nDo \u0111\u00f3, Grafana **kh\u00f4ng k\u1ebft n\u1ed1i tr\u1ef1c ti\u1ebfp t\u1edbi Pod**, m\u00e0 k\u1ebft n\u1ed1i t\u1edbi Kubernetes Service:\n\n```text\nloki.logging.svc.cluster.local\n```\n\nService s\u1ebd t\u1ef1 \u0111\u1ed9ng chuy\u1ec3n ti\u1ebfp request t\u1edbi Pod \u0111ang ho\u1ea1t \u0111\u1ed9ng.\n\n\u0110\u00e2y c\u0169ng l\u00e0 c\u00e1ch c\u00e1c \u1ee9ng d\u1ee5ng trong Kubernetes giao ti\u1ebfp v\u1edbi nhau.\n\n---\n\n# B\u01b0\u1edbc 4. M\u1edf Explore\n\nGrafana c\u00f3 hai khu v\u1ef1c ch\u00ednh:\n\n* Dashboard\n* Explore\n\nDashboard d\u00f9ng \u0111\u1ec3 hi\u1ec3n th\u1ecb Metrics.\n\nExplore d\u00f9ng \u0111\u1ec3:\n\n* Query Metrics.\n* Query Logs.\n* Debug.\n\nCh\u1ecdn:\n\n```text\nExplore\n```\n\n\u1ede g\u00f3c tr\u00ean b\u00ean tr\u00e1i, ch\u1ecdn Data Source:\n\n```text\nLoki\n```\n\n\u0110\u00e2y s\u1ebd l\u00e0 n\u01a1i ch\u00fang ta th\u1ef1c hi\u1ec7n c\u00e1c truy v\u1ea5n LogQL.\n\n---\n\n# B\u01b0\u1edbc 5. Th\u1ef1c hi\u1ec7n truy v\u1ea5n \u0111\u1ea7u ti\u00ean\n\nNh\u1eadp:\n\n```logql\n{}\n```\n\nNh\u1ea5n:\n\n```text\nRun Query\n```\n\nN\u1ebfu Fluent Bit \u0111\u00e3 g\u1eedi log th\u00e0nh c\u00f4ng, b\u1ea1n s\u1ebd th\u1ea5y r\u1ea5t nhi\u1ec1u d\u00f2ng log t\u1eeb to\u00e0n b\u1ed9 Cluster.\n\nV\u00ed d\u1ee5:\n\n```text\nINFO Spring Boot started\n\nGET \/api\/todos\n\nPrometheus scrape completed\n\nGrafana request\n\n...\n```\n\nL\u01b0u \u00fd r\u1eb1ng:\n\n```logql\n{}\n```\n\nc\u00f3 ngh\u0129a l\u00e0:\n\n> Hi\u1ec3n th\u1ecb t\u1ea5t c\u1ea3 Log Stream.\n\nTrong Cluster th\u1ef1c t\u1ebf c\u00f3 h\u00e0ng tr\u0103m Pod, truy v\u1ea5n n\u00e0y th\u01b0\u1eddng tr\u1ea3 v\u1ec1 r\u1ea5t nhi\u1ec1u d\u1eef li\u1ec7u n\u00ean \u00edt khi \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng.\n\n---\n\n# B\u01b0\u1edbc 6. T\u00ecm log theo Namespace\n\nTrong Kubernetes, m\u1ed7i \u1ee9ng d\u1ee5ng th\u01b0\u1eddng n\u1eb1m trong m\u1ed9t Namespace.\n\nV\u00ed d\u1ee5:\n\n```text\ntodo-app\n\nmonitoring\n\nlogging\n\nkube-system\n```\n\n\u0110\u1ec3 ch\u1ec9 xem log c\u1ee7a \u1ee9ng d\u1ee5ng Todo:\n\n```logql\n{namespace=\"todo-app\"}\n```\n\nV\u00ed d\u1ee5 k\u1ebft qu\u1ea3:\n\n```text\nINFO Application started\n\nGET \/api\/todos\n\nPOST \/api\/todos\n\nERROR Database timeout\n```\n\nSo v\u1edbi:\n\n```logql\n{}\n```\n\nk\u1ebft qu\u1ea3 l\u00fac n\u00e0y ch\u1ec9 c\u00f2n log c\u1ee7a Namespace `todo-app`.\n\n---\n\n# B\u01b0\u1edbc 7. T\u00ecm log theo Pod\n\nGi\u1ea3 s\u1eed \u1ee9ng d\u1ee5ng Backend c\u00f3 Pod:\n\n```text\ntodo-backend-6c89b7d4f9-4mv8h\n```\n\nC\u00f3 th\u1ec3 truy v\u1ea5n:\n\n```logql\n{pod=\"todo-backend-6c89b7d4f9-4mv8h\"}\n```\n\nHo\u1eb7c:\n\n```logql\n{app=\"todo-backend\"}\n```\n\n(n\u1ebfu Fluent Bit \u0111\u00e3 th\u00eam Label `app`).\n\nV\u00ed d\u1ee5:\n\n```text\nGET \/api\/todos\n\nPOST \/api\/todos\n\nDELETE \/api\/todos\/10\n```\n\nL\u00fac n\u00e0y ch\u00fang ta ch\u1ec9 xem log c\u1ee7a Backend.\n\n---\n\n# B\u01b0\u1edbc 8. T\u00ecm log theo n\u1ed9i dung\n\nM\u1ed9t trong nh\u1eefng t\u00ednh n\u0103ng m\u1ea1nh nh\u1ea5t c\u1ee7a Loki l\u00e0 t\u00ecm ki\u1ebfm theo chu\u1ed7i.\n\nV\u00ed d\u1ee5 ch\u1ec9 l\u1ea5y log ch\u1ee9a t\u1eeb:\n\n```text\nERROR\n```\n\nTruy v\u1ea5n:\n\n```logql\n{namespace=\"todo-app\"} |= \"ERROR\"\n```\n\nV\u00ed d\u1ee5:\n\n```text\nERROR Database connection timeout\n\nERROR PostgreSQL refused connection\n\nERROR Transaction rollback\n```\n\nTo\u00e1n t\u1eed:\n\n```text\n|=\n```\n\nc\u00f3 ngh\u0129a l\u00e0:\n\n> Ch\u1ec9 l\u1ea5y log ch\u1ee9a chu\u1ed7i ch\u1ec9 \u0111\u1ecbnh.\n\n\u0110\u00e2y l\u00e0 truy v\u1ea5n \u0111\u01b0\u1ee3c DevOps s\u1eed d\u1ee5ng r\u1ea5t th\u01b0\u1eddng xuy\u00ean khi \u0111i\u1ec1u tra s\u1ef1 c\u1ed1.\n\n---\n\n# B\u01b0\u1edbc 9. T\u00ecm HTTP 500\n\nGi\u1ea3 s\u1eed \u1ee9ng d\u1ee5ng ghi log nh\u01b0 sau:\n\n```text\nGET \/api\/todos 500\n\nPOST \/api\/users 500\n\nGET \/api\/login 200\n```\n\nC\u00f3 th\u1ec3 truy v\u1ea5n:\n\n```logql\n{namespace=\"todo-app\"} |= \"500\"\n```\n\nV\u00ed d\u1ee5:\n\n```text\nGET \/api\/todos 500\n\nPOST \/api\/users 500\n```\n\nDevOps c\u00f3 th\u1ec3 nhanh ch\u00f3ng x\u00e1c \u0111\u1ecbnh c\u00e1c request \u0111ang tr\u1ea3 v\u1ec1 l\u1ed7i.\n\n---\n\n# B\u01b0\u1edbc 10. Hi\u1ec3u Label trong Loki\n\n\u0110i\u1ec3m kh\u00e1c bi\u1ec7t l\u1edbn nh\u1ea5t gi\u1eefa Loki v\u00e0 c\u00e1c h\u1ec7 th\u1ed1ng Logging truy\u1ec1n th\u1ed1ng l\u00e0 **Label**.\n\nV\u00ed d\u1ee5 m\u1ed9t Log Stream:\n\n```text\nnamespace=\"todo-app\"\n\npod=\"todo-backend-6c89b7d4f9\"\n\ncontainer=\"backend\"\n\napp=\"todo-backend\"\n```\n\n\u0110\u00e2y ch\u00ednh l\u00e0 c\u00e1c Label.\n\nKhi truy v\u1ea5n:\n\n```logql\n{namespace=\"todo-app\"}\n```\n\nLoki s\u1ebd t\u00ecm Label tr\u01b0\u1edbc.\n\nSau \u0111\u00f3 m\u1edbi \u0111\u1ecdc n\u1ed9i dung log.\n\nNh\u1edd v\u1eady t\u1ed1c \u0111\u1ed9 truy v\u1ea5n r\u1ea5t nhanh.\n\n---\n\n# Hi\u1ec3u Log Stream\n\nM\u1ed9t **Log Stream** l\u00e0 t\u1eadp h\u1ee3p c\u00e1c log c\u00f3 c\u00f9ng Label.\n\nV\u00ed d\u1ee5:\n\n```text\nnamespace=\"todo-app\"\n\npod=\"backend\"\n\ncontainer=\"backend\"\n```\n\nl\u00e0 m\u1ed9t Log Stream.\n\nTrong khi:\n\n```text\nnamespace=\"todo-app\"\n\npod=\"frontend\"\n\ncontainer=\"frontend\"\n```\n\nl\u1ea1i l\u00e0 m\u1ed9t Log Stream kh\u00e1c.\n\nKhi Cluster c\u00f3 h\u00e0ng ngh\u00ecn Pod, Loki v\u1eabn c\u00f3 th\u1ec3 t\u00ecm \u0111\u00fang Log Stream ch\u1ec9 trong th\u1eddi gian r\u1ea5t ng\u1eafn.\n\n---\n\n# Nh\u1eefng truy v\u1ea5n LogQL c\u01a1 b\u1ea3n\n\n| M\u1ee5c \u0111\u00edch       | Truy v\u1ea5n                             |\n| -------------- | ------------------------------------ |\n| T\u1ea5t c\u1ea3 log     | `{} `                                |\n| Theo Namespace | `{namespace=\"todo-app\"}`             |\n| Theo Pod       | `{pod=\"todo-backend-xxxx\"}`          |\n| Theo Container | `{container=\"backend\"}`              |\n| Ch\u1ee9a ERROR     | `{namespace=\"todo-app\"} \\|= \"ERROR\"` |\n| Ch\u1ee9a WARN      | `{namespace=\"todo-app\"} \\|= \"WARN\"`  |\n| Ch\u1ee9a HTTP 500  | `{namespace=\"todo-app\"} \\|= \"500\"`   |\n\n\u0110\u00e2y l\u00e0 nh\u1eefng truy v\u1ea5n b\u1ea1n s\u1ebd s\u1eed d\u1ee5ng th\u01b0\u1eddng xuy\u00ean trong qu\u00e1 tr\u00ecnh v\u1eadn h\u00e0nh h\u1ec7 th\u1ed1ng.\n\n---\n\n# Nh\u1eefng l\u1ed7i th\u01b0\u1eddng g\u1eb7p\n\n## Kh\u00f4ng th\u1ea5y Data Source Loki\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get svc -n logging\n```\n\n\u0110\u1ea3m b\u1ea3o Service Loki \u0111ang ho\u1ea1t \u0111\u1ed9ng.\n\n---\n\n## Save & Test th\u1ea5t b\u1ea1i\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get pods -n logging\n```\n\n\u0110\u1ea3m b\u1ea3o Pod Loki \u1edf tr\u1ea1ng th\u00e1i:\n\n```text\nRunning\n```\n\n\u0110\u1ed3ng th\u1eddi ki\u1ec3m tra URL c\u1ee7a Data Source \u0111\u00e3 \u0111\u00fang hay ch\u01b0a.\n\n---\n\n## Kh\u00f4ng c\u00f3 log\n\nKi\u1ec3m tra:\n\n* Fluent Bit c\u00f3 \u0111ang ch\u1ea1y kh\u00f4ng?\n* Fluent Bit \u0111\u00e3 g\u1eedi log t\u1edbi Loki ch\u01b0a?\n* \u1ee8ng d\u1ee5ng c\u00f3 \u0111ang sinh log kh\u00f4ng?\n\nC\u00f3 th\u1ec3 t\u1ea1o m\u1ed9t v\u00e0i request t\u1edbi Backend:\n\n```bash\ncurl http:\/\/localhost:8080\/api\/todos\n```\n\nSau \u0111\u00f3 ch\u1ea1y l\u1ea1i truy v\u1ea5n trong Grafana.\n\n---\n\n# K\u1ebft qu\u1ea3 \u0111\u1ea1t \u0111\u01b0\u1ee3c\n\nSau ph\u1ea7n n\u00e0y, ch\u00fang ta \u0111\u00e3:\n\n* K\u1ebft n\u1ed1i Grafana v\u1edbi Loki.\n* Th\u1ef1c hi\u1ec7n truy v\u1ea5n LogQL \u0111\u1ea7u ti\u00ean.\n* T\u00ecm ki\u1ebfm log theo Namespace.\n* T\u00ecm ki\u1ebfm log theo Pod.\n* T\u00ecm ki\u1ebfm log theo n\u1ed9i dung.\n* Hi\u1ec3u Label v\u00e0 Log Stream trong Loki.\n\n\u0110\u1ebfn \u0111\u00e2y, ch\u00fang ta \u0111\u00e3 c\u00f3 th\u1ec3 xem log c\u1ee7a to\u00e0n b\u1ed9 Kubernetes Cluster ngay tr\u00ean Grafana m\u00e0 kh\u00f4ng c\u1ea7n s\u1eed d\u1ee5ng `kubectl logs`.\n\nTuy nhi\u00ean, vi\u1ec7c ch\u1ec9 bi\u1ebft c\u00e1ch t\u00ecm log v\u1eabn ch\u01b0a \u0111\u1ee7. \u0110i\u1ec1u quan tr\u1ecdng h\u01a1n l\u00e0 **l\u00e0m th\u1ebf n\u00e0o \u0111\u1ec3 s\u1eed d\u1ee5ng Metrics, Alerts v\u00e0 Logs c\u00f9ng nhau \u0111\u1ec3 \u0111i\u1ec1u tra m\u1ed9t s\u1ef1 c\u1ed1 th\u1ef1c t\u1ebf**.\n\n\u0110\u00f3 c\u0169ng ch\u00ednh l\u00e0 n\u1ed9i dung c\u1ee7a **Ph\u1ea7n 5**, n\u01a1i ch\u00fang ta s\u1ebd m\u00f4 ph\u1ecfng m\u1ed9t s\u1ef1 c\u1ed1 trong h\u1ec7 th\u1ed1ng Todo v\u00e0 \u00e1p d\u1ee5ng quy tr\u00ecnh \u0111i\u1ec1u tra s\u1ef1 c\u1ed1 m\u00e0 c\u00e1c \u0111\u1ed9i ng\u0169 DevOps th\u01b0\u1eddng s\u1eed d\u1ee5ng trong m\u00f4i tr\u01b0\u1eddng Production.","published_at":"2026-08-05T11:17:41.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T18:21:02.000000Z","edited_at":"2026-08-05T11:17:28.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":6,"points":0,"views_count":8,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/e098310a-f986-432f-9df8-c803f3d7e015.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":59,"reputation":1181,"posts_count":100,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"centralized-logging","name":"centralized logging"},{"slug":"fluent-bit","name":"Fluent Bit"},{"slug":"grafana","name":"grafana"},{"slug":"loki","name":"Loki"},{"slug":"kubernetes","name":"Kubernetes"}]},"commentators":{"data":[]}},{"id":104818,"title":"Lab 9.3 - X\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng Centralized Logging v\u1edbi Fluent Bit, Loki v\u00e0 Grafana","slug":"7Z4DEylyJnX","url":"https:\/\/viblo.asia\/p\/lab-93-xay-dung-he-thong-centralized-logging-voi-fluent-bit-loki-va-grafana-7Z4DEylyJnX","user_id":98940,"moderation":null,"transliterated":"lab-93-xay-dung-he-thong-centralized-logging-voi-fluent-bit-loki-va-grafana","contents_short":"Ph\u1ea7n 3 - Tri\u1ec3n khai Fluent Bit v\u00e0 thu th\u1eadp Log t\u1eeb Kubernetes\n\n\u1ede ph\u1ea7n tr\u01b0\u1edbc, ch\u00fang ta \u0111\u00e3 tri\u1ec3n khai th\u00e0nh c\u00f4ng Loki \u0111\u1ec3 l\u01b0u tr\u1eef log.\n\nTuy nhi\u00ean, n\u1ebfu m\u1edf Grafana ho\u1eb7c truy c\u1eadp tr\u1ef1c ti\u1ebfp v\u00e0o Loki l\u00fac n\u00e0y, b\u1ea1n s\u1ebd th\u1ea5y kh\u00f4ng c\u00f3 b\u1ea5t k\u1ef3 log n\u00e0o.\n\nL\u00fd do r\u1ea5t \u0111\u01a1n gi\u1ea3n:\n\nLoki ch\u1ec9 l\u00e0 n\u01a1i l\u01b0u tr\u1eef log, ch\u1ee9 kh\u00f4ng t\u1ef1 thu th\u1eadp log.\n\n\u0110\u1ec3 \u0111\u01b0a log t\u1eeb c\u00e1c Pod v\u00e0o Loki, ch\u00fang ta c\u1ea7n m\u1ed9t Log Collector.\n\nTrong Lab n\u00e0y, c...","contents":"# Ph\u1ea7n 3 - Tri\u1ec3n khai Fluent Bit v\u00e0 thu th\u1eadp Log t\u1eeb Kubernetes\n\n\u1ede ph\u1ea7n tr\u01b0\u1edbc, ch\u00fang ta \u0111\u00e3 tri\u1ec3n khai th\u00e0nh c\u00f4ng **Loki** \u0111\u1ec3 l\u01b0u tr\u1eef log.\n\nTuy nhi\u00ean, n\u1ebfu m\u1edf Grafana ho\u1eb7c truy c\u1eadp tr\u1ef1c ti\u1ebfp v\u00e0o Loki l\u00fac n\u00e0y, b\u1ea1n s\u1ebd th\u1ea5y **kh\u00f4ng c\u00f3 b\u1ea5t k\u1ef3 log n\u00e0o**.\n\nL\u00fd do r\u1ea5t \u0111\u01a1n gi\u1ea3n:\n\n> Loki ch\u1ec9 l\u00e0 n\u01a1i **l\u01b0u tr\u1eef log**, ch\u1ee9 **kh\u00f4ng t\u1ef1 thu th\u1eadp log**.\n\n\u0110\u1ec3 \u0111\u01b0a log t\u1eeb c\u00e1c Pod v\u00e0o Loki, ch\u00fang ta c\u1ea7n m\u1ed9t **Log Collector**.\n\nTrong Lab n\u00e0y, ch\u00fang ta s\u1ebd s\u1eed d\u1ee5ng **Fluent Bit**.\n\n---\n\n# M\u1ee5c ti\u00eau c\u1ee7a ph\u1ea7n n\u00e0y\n\nSau khi ho\u00e0n th\u00e0nh ph\u1ea7n n\u00e0y, b\u1ea1n s\u1ebd:\n\n* Hi\u1ec3u Fluent Bit l\u00e0 g\u00ec.\n* Hi\u1ec3u v\u00ec sao Fluent Bit ch\u1ea1y d\u01b0\u1edbi d\u1ea1ng DaemonSet.\n* Tri\u1ec3n khai Fluent Bit b\u1eb1ng Helm.\n* C\u1ea5u h\u00ecnh Fluent Bit g\u1eedi log \u0111\u1ebfn Loki.\n* Ki\u1ec3m tra Fluent Bit \u0111ang thu th\u1eadp log t\u1eeb Kubernetes.\n* X\u00e1c nh\u1eadn log \u0111\u00e3 \u0111\u01b0\u1ee3c g\u1eedi t\u1edbi Loki.\n\n---\n\n# Fluent Bit l\u00e0 g\u00ec?\n\nFluent Bit l\u00e0 m\u1ed9t **Log Collector** c\u00f3 hi\u1ec7u n\u0103ng cao, \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf \u0111\u1ec3 thu th\u1eadp v\u00e0 chuy\u1ec3n ti\u1ebfp log.\n\nTrong Kubernetes, Fluent Bit th\u01b0\u1eddng \u0111\u1ea3m nh\u1eadn c\u00e1c nhi\u1ec7m v\u1ee5:\n\n* Theo d\u00f5i log c\u1ee7a t\u1ea5t c\u1ea3 Container tr\u00ean Node.\n* \u0110\u1ecdc log m\u1edbi ngay khi ch\u00fang \u0111\u01b0\u1ee3c t\u1ea1o.\n* Th\u00eam th\u00f4ng tin Kubernetes (Metadata).\n* G\u1eedi log \u0111\u1ebfn Loki.\n\nC\u00f3 th\u1ec3 h\u00ecnh dung Fluent Bit gi\u1ed1ng nh\u01b0 m\u1ed9t \"ng\u01b0\u1eddi \u0111\u01b0a th\u01b0\":\n\n```text\nContainer\n\n\u2193\n\nSinh log\n\n\u2193\n\nFluent Bit\n\n\u2193\n\nLoki\n\n\u2193\n\nGrafana\n```\n\n---\n\n# V\u00ec sao Fluent Bit ch\u1ea1y d\u01b0\u1edbi d\u1ea1ng DaemonSet?\n\nM\u1ed9t Kubernetes Cluster th\u01b0\u1eddng c\u00f3 nhi\u1ec1u Node.\n\nV\u00ed d\u1ee5:\n\n```text\nNode 1\n\u251c\u2500\u2500 Backend Pod\n\u251c\u2500\u2500 Frontend Pod\n\nNode 2\n\u251c\u2500\u2500 PostgreSQL Pod\n\nNode 3\n\u251c\u2500\u2500 Prometheus\n\u251c\u2500\u2500 Grafana\n```\n\nLog c\u1ee7a m\u1ed7i Pod \u0111\u01b0\u1ee3c l\u01b0u tr\u00ean ch\u00ednh Node m\u00e0 Pod \u0111ang ch\u1ea1y.\n\nN\u1ebfu ch\u1ec9 ch\u1ea1y m\u1ed9t Pod Fluent Bit duy nh\u1ea5t, n\u00f3 s\u1ebd kh\u00f4ng th\u1ec3 \u0111\u1ecdc log tr\u00ean c\u00e1c Node kh\u00e1c.\n\nGi\u1ea3i ph\u00e1p l\u00e0 tri\u1ec3n khai Fluent Bit d\u01b0\u1edbi d\u1ea1ng **DaemonSet**.\n\nDaemonSet \u0111\u1ea3m b\u1ea3o:\n\n> **M\u1ed7i Node lu\u00f4n c\u00f3 \u0111\u00fang m\u1ed9t Pod Fluent Bit.**\n\nV\u00ed d\u1ee5:\n\n```text\n                    Kubernetes Cluster\n\n        +----------------+   +----------------+   +----------------+\n        |     Node 1     |   |     Node 2     |   |     Node 3     |\n        |----------------|   |----------------|   |----------------|\n        | Backend Pod    |   | PostgreSQL Pod |   | Prometheus     |\n        | Frontend Pod   |   | Fluent Bit     |   | Grafana        |\n        | Fluent Bit     |   |                |   | Fluent Bit     |\n        +----------------+   +----------------+   +----------------+\n                 \\                 |                 \/\n                  \\                |                \/\n                   \\               |               \/\n                    +-----------------------------+\n                    |            Loki             |\n                    +-----------------------------+\n```\n\nNh\u1edd v\u1eady, Fluent Bit c\u00f3 th\u1ec3 thu th\u1eadp log c\u1ee7a to\u00e0n b\u1ed9 Cluster.\n\n---\n\n# Fluent Bit \u0111\u1ecdc log \u1edf \u0111\u00e2u?\n\nNhi\u1ec1u ng\u01b0\u1eddi ngh\u0129 Fluent Bit \u0111\u1ecdc log tr\u1ef1c ti\u1ebfp t\u1eeb \u1ee9ng d\u1ee5ng.\n\nTh\u1ef1c t\u1ebf kh\u00f4ng ph\u1ea3i v\u1eady.\n\nQuy tr\u00ecnh ho\u1ea1t \u0111\u1ed9ng nh\u01b0 sau:\n\n```text\nSpring Boot\n\n\u2193\n\nstdout \/ stderr\n\n\u2193\n\nContainer Runtime\n\n\u2193\n\n\/var\/log\/containers\/*.log\n\n\u2193\n\nFluent Bit\n\n\u2193\n\nLoki\n```\n\nContainer Runtime (Docker ho\u1eb7c containerd) s\u1ebd ghi log c\u1ee7a m\u1ed7i Container v\u00e0o th\u01b0 m\u1ee5c:\n\n```text\n\/var\/log\/containers\/\n```\n\nV\u00ed d\u1ee5:\n\n```text\ntodo-backend-7f9d8c6d7f-abc12_todo-app_backend.log\n\ntodo-frontend-69dfb7fd95-def34_todo-app_frontend.log\n\nprometheus-server.log\n```\n\nFluent Bit ch\u1ec9 c\u1ea7n theo d\u00f5i th\u01b0 m\u1ee5c n\u00e0y v\u00e0 g\u1eedi c\u00e1c log m\u1edbi \u0111\u1ebfn Loki.\n\n---\n\n# B\u01b0\u1edbc 1. Th\u00eam Helm Repository\n\nFluent Bit \u0111\u01b0\u1ee3c ph\u00e1t h\u00e0nh th\u00f4ng qua Helm Chart.\n\nTh\u00eam Repository:\n\n```bash\nhelm repo add fluent https:\/\/fluent.github.io\/helm-charts\n```\n\nC\u1eadp nh\u1eadt Repository:\n\n```bash\nhelm repo update\n```\n\nKi\u1ec3m tra:\n\n```bash\nhelm search repo fluent\/fluent-bit\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME                      CHART VERSION\nfluent\/fluent-bit         x.x.x\n```\n\n---\n\n# B\u01b0\u1edbc 2. C\u00e0i \u0111\u1eb7t Fluent Bit\n\n\u0110\u1ec3 Fluent Bit c\u00f3 th\u1ec3 g\u1eedi log \u0111\u1ebfn Loki ngay sau khi c\u00e0i \u0111\u1eb7t, ch\u00fang ta c\u1ea5u h\u00ecnh tr\u1ef1c ti\u1ebfp th\u00f4ng qua tham s\u1ed1 `--set`.\n\n> **L\u01b0u \u00fd:** \u0110\u1ecba ch\u1ec9 Loki c\u00f3 th\u1ec3 kh\u00e1c nhau t\u00f9y Helm Chart. Trong Lab n\u00e0y ch\u00fang ta s\u1eed d\u1ee5ng Service `loki` trong Namespace `logging`.\n\nTh\u1ef1c hi\u1ec7n:\n\n```bash\nhelm install fluent-bit fluent\/fluent-bit \\\n  -n logging \\\n  --set backend.type=loki \\\n  --set backend.loki.host=loki.logging.svc.cluster.local \\\n  --set backend.loki.port=3100\n```\n\nSau khi c\u00e0i \u0111\u1eb7t th\u00e0nh c\u00f4ng:\n\n```text\nNAME: fluent-bit\n\nSTATUS: deployed\n```\n\n---\n\n# B\u01b0\u1edbc 3. Ki\u1ec3m tra Pod\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get pods -n logging\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME                             READY   STATUS\nfluent-bit-k82fj                 1\/1     Running\nloki-0                           1\/1     Running\n```\n\nN\u1ebfu Cluster c\u00f3 nhi\u1ec1u Node:\n\n```text\nNAME\n\nfluent-bit-abc12\n\nfluent-bit-def34\n\nfluent-bit-ghi56\n```\n\nS\u1ed1 l\u01b0\u1ee3ng Pod Fluent Bit s\u1ebd b\u1eb1ng s\u1ed1 l\u01b0\u1ee3ng Node.\n\n---\n\n# B\u01b0\u1edbc 4. Ki\u1ec3m tra DaemonSet\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get daemonset -n logging\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME         DESIRED   CURRENT   READY\n\nfluent-bit         3         3       3\n```\n\n\u00dd ngh\u0129a:\n\n* **DESIRED**: S\u1ed1 Pod c\u1ea7n ch\u1ea1y (b\u1eb1ng s\u1ed1 Node).\n* **CURRENT**: S\u1ed1 Pod hi\u1ec7n c\u00f3.\n* **READY**: S\u1ed1 Pod s\u1eb5n s\u00e0ng ho\u1ea1t \u0111\u1ed9ng.\n\nN\u1ebfu c\u1ea3 ba gi\u00e1 tr\u1ecb b\u1eb1ng nhau, Fluent Bit \u0111\u00e3 \u0111\u01b0\u1ee3c tri\u1ec3n khai th\u00e0nh c\u00f4ng tr\u00ean t\u1ea5t c\u1ea3 c\u00e1c Node.\n\n---\n\n# B\u01b0\u1edbc 5. Ki\u1ec3m tra c\u1ea5u h\u00ecnh Fluent Bit\n\nKi\u1ec3m tra ConfigMap:\n\n```bash\nkubectl get configmap -n logging\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME\n\nfluent-bit\n```\n\nXem c\u1ea5u h\u00ecnh:\n\n```bash\nkubectl get configmap fluent-bit \\\n-n logging \\\n-o yaml\n```\n\nTrong c\u1ea5u h\u00ecnh, b\u1ea1n s\u1ebd th\u1ea5y c\u00e1c ph\u1ea7n ch\u00ednh:\n\n* **INPUT**: \u0110\u1ecdc log t\u1eeb `\/var\/log\/containers`.\n* **FILTER**: Th\u00eam Metadata c\u1ee7a Kubernetes.\n* **OUTPUT**: G\u1eedi log \u0111\u1ebfn Loki.\n\n\u0110\u00e2y ch\u00ednh l\u00e0 ba th\u00e0nh ph\u1ea7n quan tr\u1ecdng nh\u1ea5t c\u1ee7a Fluent Bit.\n\n---\n\n# B\u01b0\u1edbc 6. Ki\u1ec3m tra Fluent Bit \u0111ang \u0111\u1ecdc log\n\nXem log c\u1ee7a Fluent Bit:\n\n```bash\nkubectl logs \\\n-l app.kubernetes.io\/name=fluent-bit \\\n-n logging\n```\n\nV\u00ed d\u1ee5:\n\n```text\n[ info] tail.0 started\n\n[ info] reading \/var\/log\/containers\n\n[ info] kube filter initialized\n\n[ info] output=loki\n```\n\nC\u00e1c th\u00f4ng b\u00e1o tr\u00ean cho th\u1ea5y:\n\n* Fluent Bit \u0111\u00e3 b\u1eaft \u0111\u1ea7u theo d\u00f5i log.\n* \u0110\u00e3 k\u1ebft n\u1ed1i t\u1edbi Kubernetes API \u0111\u1ec3 l\u1ea5y Metadata.\n* \u0110\u00e3 s\u1eb5n s\u00e0ng g\u1eedi log t\u1edbi Loki.\n\n---\n\n# B\u01b0\u1edbc 7. Ki\u1ec3m tra Log c\u1ee7a \u1ee9ng d\u1ee5ng\n\nSinh m\u1ed9t v\u00e0i request t\u1edbi \u1ee9ng d\u1ee5ng:\n\n```bash\ncurl http:\/\/localhost:8080\/api\/todos\n```\n\nHo\u1eb7c:\n\n```bash\ncurl -X POST \\\nhttp:\/\/localhost:8080\/api\/todos\n```\n\nSau \u0111\u00f3 ki\u1ec3m tra log c\u1ee7a Fluent Bit:\n\n```bash\nkubectl logs \\\n-l app.kubernetes.io\/name=fluent-bit \\\n-n logging \\\n--tail=20\n```\n\nN\u1ebfu m\u1ecdi th\u1ee9 ho\u1ea1t \u0111\u1ed9ng \u0111\u00fang, Fluent Bit s\u1ebd ti\u1ebfp t\u1ee5c ghi nh\u1eadn c\u00e1c log m\u1edbi v\u00e0 chuy\u1ec3n ch\u00fang t\u1edbi Loki.\n\n---\n\n# B\u01b0\u1edbc 8. Ki\u1ec3m tra Loki \u0111\u00e3 nh\u1eadn log\n\nHi\u1ec7n t\u1ea1i ch\u00fang ta ch\u01b0a k\u1ebft n\u1ed1i Grafana v\u1edbi Loki.\n\nTuy nhi\u00ean c\u00f3 th\u1ec3 ki\u1ec3m tra nhanh b\u1eb1ng c\u00e1ch xem log c\u1ee7a Loki:\n\n```bash\nkubectl logs \\\nloki-0 \\\n-n logging\n```\n\nB\u1ea1n c\u00f3 th\u1ec3 th\u1ea5y c\u00e1c th\u00f4ng b\u00e1o t\u01b0\u01a1ng t\u1ef1:\n\n```text\nreceived log stream\n\ningested entries\n\npush request received\n```\n\n\u0110i\u1ec1u n\u00e0y cho th\u1ea5y Loki \u0111\u00e3 b\u1eaft \u0111\u1ea7u nh\u1eadn log t\u1eeb Fluent Bit.\n\n---\n\n# Lu\u1ed3ng ho\u1ea1t \u0111\u1ed9ng ho\u00e0n ch\u1ec9nh\n\nSau khi tri\u1ec3n khai Fluent Bit, h\u1ec7 th\u1ed1ng Logging ho\u1ea1t \u0111\u1ed9ng theo quy tr\u00ecnh sau:\n\n```text\nSpring Boot\n\n      \u2502\n\nlog.info()\n\nlog.error()\n\n      \u2502\n\nstdout \/ stderr\n\n      \u2502\n\nContainer Runtime\n\n      \u2502\n\n\/var\/log\/containers\n\n      \u2502\n\nFluent Bit\n\n      \u2502\n\nKubernetes Metadata\n\n      \u2502\n\nLoki\n\n      \u2502\n\nGrafana\n```\n\nM\u1ed7i khi \u1ee9ng d\u1ee5ng sinh log:\n\n```text\nERROR Database connection timeout\n```\n\nFluent Bit s\u1ebd t\u1ef1 \u0111\u1ed9ng:\n\n1. \u0110\u1ecdc log.\n2. Th\u00eam Metadata nh\u01b0 Namespace, Pod, Container.\n3. G\u1eedi t\u1edbi Loki.\n4. L\u01b0u tr\u1eef \u0111\u1ec3 Grafana truy v\u1ea5n.\n\nTo\u00e0n b\u1ed9 qu\u00e1 tr\u00ecnh n\u00e0y di\u1ec5n ra ho\u00e0n to\u00e0n t\u1ef1 \u0111\u1ed9ng.\n\n---\n\n# Nh\u1eefng l\u1ed7i th\u01b0\u1eddng g\u1eb7p\n\n## Fluent Bit kh\u00f4ng kh\u1edfi \u0111\u1ed9ng\n\nKi\u1ec3m tra:\n\n```bash\nkubectl describe pod <fluent-bit-pod> -n logging\n```\n\n\u0110\u1eb7c bi\u1ec7t ch\u00fa \u00fd ph\u1ea7n **Events** \u0111\u1ec3 x\u00e1c \u0111\u1ecbnh nguy\u00ean nh\u00e2n.\n\n---\n\n## Fluent Bit kh\u00f4ng \u0111\u1ecdc \u0111\u01b0\u1ee3c log\n\nKi\u1ec3m tra log:\n\n```bash\nkubectl logs <fluent-bit-pod> -n logging\n```\n\n\u0110\u1ea3m b\u1ea3o Fluent Bit \u0111\u00e3 mount \u0111\u00fang th\u01b0 m\u1ee5c:\n\n```text\n\/var\/log\/containers\n```\n\n---\n\n## Loki kh\u00f4ng nh\u1eadn log\n\nKi\u1ec3m tra:\n\n* Service c\u1ee7a Loki.\n* \u0110\u1ecba ch\u1ec9 `host` trong c\u1ea5u h\u00ecnh Fluent Bit.\n* Tr\u1ea1ng th\u00e1i Pod Loki.\n\n\u0110\u1ed3ng th\u1eddi xem log c\u1ee7a c\u1ea3 Fluent Bit v\u00e0 Loki \u0111\u1ec3 x\u00e1c \u0111\u1ecbnh l\u1ed7i k\u1ebft n\u1ed1i.\n\n---\n\n# K\u1ebft qu\u1ea3 \u0111\u1ea1t \u0111\u01b0\u1ee3c\n\nSau ph\u1ea7n n\u00e0y, ch\u00fang ta \u0111\u00e3:\n\n* Tri\u1ec3n khai Fluent Bit tr\u00ean Kubernetes.\n* Hi\u1ec3u v\u00ec sao Fluent Bit s\u1eed d\u1ee5ng DaemonSet.\n* Hi\u1ec3u c\u00e1ch Fluent Bit \u0111\u1ecdc log t\u1eeb `\/var\/log\/containers`.\n* C\u1ea5u h\u00ecnh Fluent Bit g\u1eedi log t\u1edbi Loki.\n* X\u00e1c nh\u1eadn h\u1ec7 th\u1ed1ng Logging \u0111\u00e3 b\u1eaft \u0111\u1ea7u thu th\u1eadp log t\u1eeb c\u00e1c Pod.\n\nKi\u1ebfn tr\u00fac hi\u1ec7n t\u1ea1i:\n\n```text\n             Spring Boot\n                  \u2502\n           stdout \/ stderr\n                  \u2502\n          \/var\/log\/containers\n                  \u2502\n             Fluent Bit\n                  \u2502\n                 Loki\n                  \u2502\n              (\u0110\u00e3 nh\u1eadn log)\n                  \u2502\n               Grafana\n```\n\n\u1ede **Ph\u1ea7n 4**, ch\u00fang ta s\u1ebd k\u1ebft n\u1ed1i **Grafana v\u1edbi Loki**, th\u1ef1c hi\u1ec7n nh\u1eefng truy v\u1ea5n LogQL \u0111\u1ea7u ti\u00ean v\u00e0 b\u1eaft \u0111\u1ea7u t\u00ecm ki\u1ebfm log c\u1ee7a \u1ee9ng d\u1ee5ng Todo ngay tr\u00ean giao di\u1ec7n Grafana.","published_at":"2026-08-05T11:15:59.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T16:45:03.000000Z","edited_at":"2026-08-05T11:15:26.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":6,"points":0,"views_count":10,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/1c536f20-30d2-4c9a-9a1c-c944ab60e22a.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":59,"reputation":1181,"posts_count":100,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"centralized-logging","name":"centralized logging"},{"slug":"fluent-bit","name":"Fluent Bit"},{"slug":"grafana","name":"grafana"},{"slug":"loki","name":"Loki"},{"slug":"kubernetes","name":"Kubernetes"}]},"commentators":{"data":[]}},{"id":104817,"title":"Lab 9.2 - X\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng Centralized Logging v\u1edbi Fluent Bit, Loki v\u00e0 Grafana","slug":"yZJZlzpEVjm","url":"https:\/\/viblo.asia\/p\/lab-92-xay-dung-he-thong-centralized-logging-voi-fluent-bit-loki-va-grafana-yZJZlzpEVjm","user_id":98940,"moderation":null,"transliterated":"lab-92-xay-dung-he-thong-centralized-logging-voi-fluent-bit-loki-va-grafana","contents_short":"Ph\u1ea7n 2 - Tri\u1ec3n khai Loki tr\u00ean Kubernetes\n\n\u1ede ph\u1ea7n tr\u01b0\u1edbc, ch\u00fang ta \u0111\u00e3 t\u00ecm hi\u1ec3u v\u00ec sao m\u1ed9t h\u1ec7 th\u1ed1ng Kubernetes Production c\u1ea7n Centralized Logging.\n\nTrong ph\u1ea7n n\u00e0y, ch\u00fang ta s\u1ebd tri\u1ec3n khai th\u00e0nh ph\u1ea7n \u0111\u1ea7u ti\u00ean c\u1ee7a h\u1ec7 th\u1ed1ng Logging: Loki.\n\nSau khi ho\u00e0n th\u00e0nh ph\u1ea7n n\u00e0y, ch\u00fang ta s\u1ebd c\u00f3 m\u1ed9t n\u01a1i \u0111\u1ec3 l\u01b0u tr\u1eef v\u00e0 truy v\u1ea5n to\u00e0n b\u1ed9 log c\u1ee7a c\u00e1c Pod trong Kubernetes.\n\nLoki l\u00e0 g\u00ec?\n\nLoki l\u00e0 h\u1ec7 th\u1ed1ng l\u01b0u tr\u1eef log \u0111\u01b0\u1ee3c...","contents":"# Ph\u1ea7n 2 - Tri\u1ec3n khai Loki tr\u00ean Kubernetes\n\n\u1ede ph\u1ea7n tr\u01b0\u1edbc, ch\u00fang ta \u0111\u00e3 t\u00ecm hi\u1ec3u v\u00ec sao m\u1ed9t h\u1ec7 th\u1ed1ng Kubernetes Production c\u1ea7n **Centralized Logging**.\n\nTrong ph\u1ea7n n\u00e0y, ch\u00fang ta s\u1ebd tri\u1ec3n khai th\u00e0nh ph\u1ea7n \u0111\u1ea7u ti\u00ean c\u1ee7a h\u1ec7 th\u1ed1ng Logging: **Loki**.\n\nSau khi ho\u00e0n th\u00e0nh ph\u1ea7n n\u00e0y, ch\u00fang ta s\u1ebd c\u00f3 m\u1ed9t n\u01a1i \u0111\u1ec3 l\u01b0u tr\u1eef v\u00e0 truy v\u1ea5n to\u00e0n b\u1ed9 log c\u1ee7a c\u00e1c Pod trong Kubernetes.\n\n---\n\n# Loki l\u00e0 g\u00ec?\n\n**Loki** l\u00e0 h\u1ec7 th\u1ed1ng l\u01b0u tr\u1eef log \u0111\u01b0\u1ee3c ph\u00e1t tri\u1ec3n b\u1edfi Grafana Labs.\n\nKh\u00e1c v\u1edbi c\u00e1c h\u1ec7 th\u1ed1ng Log Aggregation truy\u1ec1n th\u1ed1ng nh\u01b0 Elasticsearch, Loki \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf ri\u00eang cho m\u00f4i tr\u01b0\u1eddng Cloud Native v\u00e0 Kubernetes.\n\n\u0110i\u1ec3m kh\u00e1c bi\u1ec7t l\u1edbn nh\u1ea5t c\u1ee7a Loki l\u00e0:\n\n* Kh\u00f4ng \u0111\u00e1nh ch\u1ec9 m\u1ee5c (index) to\u00e0n b\u1ed9 n\u1ed9i dung log.\n* Ch\u1ec9 \u0111\u00e1nh ch\u1ec9 m\u1ee5c c\u00e1c Label.\n* N\u1ed9i dung log \u0111\u01b0\u1ee3c n\u00e9n v\u00e0 l\u01b0u tr\u1eef ri\u00eang.\n\nV\u00ed d\u1ee5:\n\nM\u1ed9t log c\u1ee7a \u1ee9ng d\u1ee5ng Todo:\n\n```text\n2026-08-05 10:15:03 ERROR Database connection timeout\n```\n\nKhi \u0111\u01b0\u1ee3c g\u1eedi t\u1edbi Loki, log s\u1ebd \u0111\u01b0\u1ee3c l\u01b0u c\u00f9ng c\u00e1c Label:\n\n```text\nnamespace=\"todo-app\"\napp=\"todo-backend\"\ncontainer=\"backend\"\npod=\"todo-backend-6d9f7d6c5f-j2w7m\"\n```\n\nKhi t\u00ecm ki\u1ebfm, Loki ch\u1ec9 c\u1ea7n tra c\u1ee9u c\u00e1c Label tr\u01b0\u1edbc, sau \u0111\u00f3 m\u1edbi \u0111\u1ecdc n\u1ed9i dung log. Nh\u1edd v\u1eady, Loki ti\u00eau t\u1ed1n \u00edt CPU, RAM v\u00e0 dung l\u01b0\u1ee3ng l\u01b0u tr\u1eef h\u01a1n so v\u1edbi nhi\u1ec1u h\u1ec7 th\u1ed1ng Logging truy\u1ec1n th\u1ed1ng.\n\n---\n\n# Ki\u1ebfn tr\u00fac sau khi tri\u1ec3n khai Loki\n\nSau ph\u1ea7n n\u00e0y, ki\u1ebfn tr\u00fac c\u1ee7a ch\u00fang ta s\u1ebd nh\u01b0 sau:\n\n```text\n             Spring Boot\n                  \u2502\n           stdout \/ stderr\n                  \u2502\n           Kubernetes Node\n                  \u2502\n             Fluent Bit\n                  \u2502\n                (Ch\u01b0a c\u00e0i)\n                  \u2502\n                  \u25bc\n                 Loki\n                  \u2502\n                  \u25bc\n               Grafana\n```\n\nHi\u1ec7n t\u1ea1i Loki \u0111\u00e3 s\u1eb5n s\u00e0ng nh\u1eadn log, nh\u01b0ng ch\u01b0a c\u00f3 th\u00e0nh ph\u1ea7n n\u00e0o g\u1eedi log \u0111\u1ebfn n\u00f3. Ch\u00fang ta s\u1ebd c\u00e0i Fluent Bit \u1edf ph\u1ea7n ti\u1ebfp theo.\n\n---\n\n# B\u01b0\u1edbc 1. T\u1ea1o Namespace\n\n\u0110\u1ec3 qu\u1ea3n l\u00fd c\u00e1c th\u00e0nh ph\u1ea7n Logging ri\u00eang bi\u1ec7t v\u1edbi Monitoring, ch\u00fang ta t\u1ea1o m\u1ed9t Namespace m\u1edbi.\n\n```bash\nkubectl create namespace logging\n```\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get namespaces\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME          STATUS   AGE\ndefault       Active\nkube-system   Active\nmonitoring    Active\nlogging       Active\ntodo-app      Active\n```\n\nNamespace `logging` s\u1ebd ch\u1ee9a to\u00e0n b\u1ed9 c\u00e1c th\u00e0nh ph\u1ea7n li\u00ean quan \u0111\u1ebfn h\u1ec7 th\u1ed1ng Logging.\n\n---\n\n# B\u01b0\u1edbc 2. Th\u00eam Helm Repository\n\nLoki \u0111\u01b0\u1ee3c Grafana Labs ph\u00e1t h\u00e0nh th\u00f4ng qua Helm Chart.\n\nTh\u00eam Repository:\n\n```bash\nhelm repo add grafana https:\/\/grafana.github.io\/helm-charts\n```\n\nC\u1eadp nh\u1eadt danh s\u00e1ch Chart:\n\n```bash\nhelm repo update\n```\n\nKi\u1ec3m tra:\n\n```bash\nhelm search repo grafana\/loki\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME             CHART VERSION\ngrafana\/loki     x.x.x\n```\n\n---\n\n# B\u01b0\u1edbc 3. C\u00e0i \u0111\u1eb7t Loki\n\n\u0110\u1ec3 \u0111\u01a1n gi\u1ea3n cho b\u00e0i Lab, ch\u00fang ta s\u1eed d\u1ee5ng c\u1ea5u h\u00ecnh m\u1eb7c \u0111\u1ecbnh c\u1ee7a Helm Chart.\n\n```bash\nhelm install loki \\\ngrafana\/loki \\\n-n logging\n```\n\nSau khi c\u00e0i \u0111\u1eb7t th\u00e0nh c\u00f4ng:\n\n```text\nNAME: loki\nSTATUS: deployed\n```\n\nLoki s\u1ebd t\u1ef1 \u0111\u1ed9ng t\u1ea1o c\u00e1c t\u00e0i nguy\u00ean Kubernetes c\u1ea7n thi\u1ebft nh\u01b0:\n\n* Deployment ho\u1eb7c StatefulSet (t\u00f9y chart v\u00e0 ch\u1ebf \u0111\u1ed9 tri\u1ec3n khai)\n* Service\n* ConfigMap\n* ServiceAccount\n\n---\n\n# B\u01b0\u1edbc 4. Ki\u1ec3m tra Pod\n\nKi\u1ec3m tra c\u00e1c Pod:\n\n```bash\nkubectl get pods -n logging\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME                     READY   STATUS    RESTARTS   AGE\nloki-0                   1\/1     Running   0          2m\n```\n\nN\u1ebfu Pod \u0111ang \u1edf tr\u1ea1ng th\u00e1i:\n\n```text\nRunning\n```\n\nc\u00f3 ngh\u0129a Loki \u0111\u00e3 kh\u1edfi \u0111\u1ed9ng th\u00e0nh c\u00f4ng.\n\nN\u1ebfu Pod \u1edf tr\u1ea1ng th\u00e1i:\n\n```text\nPending\n```\n\nh\u00e3y ki\u1ec3m tra:\n\n```bash\nkubectl describe pod loki-0 -n logging\n```\n\nC\u00e1c nguy\u00ean nh\u00e2n th\u01b0\u1eddng g\u1eb7p:\n\n* Thi\u1ebfu t\u00e0i nguy\u00ean CPU ho\u1eb7c Memory.\n* Kh\u00f4ng k\u00e9o \u0111\u01b0\u1ee3c Image.\n* L\u1ed7i Persistent Volume.\n\n---\n\n# B\u01b0\u1edbc 5. Ki\u1ec3m tra StatefulSet\n\nLoki s\u1eed d\u1ee5ng **StatefulSet** v\u00ec c\u1ea7n l\u01b0u tr\u1eef d\u1eef li\u1ec7u log.\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get statefulset -n logging\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME   READY   AGE\nloki   1\/1     2m\n```\n\nStatefulSet \u0111\u1ea3m b\u1ea3o:\n\n* T\u00ean Pod kh\u00f4ng thay \u0111\u1ed5i.\n* D\u1eef li\u1ec7u \u0111\u01b0\u1ee3c g\u1eafn v\u1edbi t\u1eebng Pod.\n* C\u00f3 th\u1ec3 m\u1edf r\u1ed9ng khi c\u1ea7n.\n\n---\n\n# B\u01b0\u1edbc 6. Ki\u1ec3m tra Service\n\nLoki c\u1ea7n m\u1ed9t Service \u0111\u1ec3 c\u00e1c th\u00e0nh ph\u1ea7n kh\u00e1c trong Cluster c\u00f3 th\u1ec3 truy c\u1eadp.\n\n```bash\nkubectl get svc -n logging\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME    TYPE        CLUSTER-IP      PORT(S)\nloki    ClusterIP   10.100.20.50    3100\/TCP\n```\n\n\u0110\u1ecba ch\u1ec9 n\u1ed9i b\u1ed9 c\u1ee7a Loki s\u1ebd l\u00e0:\n\n```text\nhttp:\/\/loki.logging.svc.cluster.local:3100\n```\n\n\u0110\u00e2y l\u00e0 Endpoint m\u00e0 Fluent Bit v\u00e0 Grafana s\u1ebd s\u1eed d\u1ee5ng trong c\u00e1c ph\u1ea7n ti\u1ebfp theo.\n\n---\n\n# B\u01b0\u1edbc 7. Ki\u1ec3m tra Log c\u1ee7a Loki\n\nXem log:\n\n```bash\nkubectl logs \\\nloki-0 \\\n-n logging\n```\n\nV\u00ed d\u1ee5:\n\n```text\nlevel=info msg=\"Loki started\"\n\nlevel=info msg=\"Server listening\"\n\nlevel=info msg=\"Ready to receive requests\"\n```\n\nN\u1ebfu th\u1ea5y c\u00e1c th\u00f4ng b\u00e1o tr\u00ean, Loki \u0111\u00e3 s\u1eb5n s\u00e0ng ho\u1ea1t \u0111\u1ed9ng.\n\n---\n\n# B\u01b0\u1edbc 8. Ki\u1ec3m tra Health Endpoint\n\nPort Forward:\n\n```bash\nkubectl port-forward \\\nsvc\/loki \\\n3100:3100 \\\n-n logging\n```\n\nM\u1edf Terminal m\u1edbi:\n\n```bash\ncurl http:\/\/localhost:3100\/ready\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\nready\n```\n\n\u0110i\u1ec1u n\u00e0y x\u00e1c nh\u1eadn Loki \u0111\u00e3 s\u1eb5n s\u00e0ng nh\u1eadn log.\n\n---\n\n# B\u01b0\u1edbc 9. Ki\u1ec3m tra Metrics c\u1ee7a Loki\n\nLoki c\u0169ng cung c\u1ea5p Metrics cho Prometheus.\n\nKi\u1ec3m tra:\n\n```bash\ncurl http:\/\/localhost:3100\/metrics\n```\n\nV\u00ed d\u1ee5:\n\n```text\nloki_build_info\n\nloki_request_duration_seconds\n\nloki_ingester_memory_chunks\n\nloki_distributor_ingester_appends_total\n```\n\nN\u1ebfu mu\u1ed1n, b\u1ea1n c\u00f3 th\u1ec3 th\u00eam Loki v\u00e0o Prometheus \u0111\u1ec3 theo d\u00f5i hi\u1ec7u n\u0103ng c\u1ee7a ch\u00ednh h\u1ec7 th\u1ed1ng Logging.\n\n---\n\n# B\u01b0\u1edbc 10. Ki\u1ec3m tra Helm Release\n\nXem Release:\n\n```bash\nhelm list -n logging\n```\n\nV\u00ed d\u1ee5:\n\n```text\nNAME   NAMESPACE   STATUS\nloki   logging     deployed\n```\n\nXem c\u1ea5u h\u00ecnh:\n\n```bash\nhelm get values loki -n logging\n```\n\n\u0110\u00e2y l\u00e0 c\u00e1ch ki\u1ec3m tra c\u00e1c c\u1ea5u h\u00ecnh \u0111\u00e3 \u00e1p d\u1ee5ng v\u00e0 s\u1ebd r\u1ea5t h\u1eefu \u00edch khi c\u1ea7n t\u00f9y ch\u1ec9nh Loki trong m\u00f4i tr\u01b0\u1eddng Production.\n\n---\n\n# Nh\u1eefng l\u1ed7i th\u01b0\u1eddng g\u1eb7p\n\n## Pod kh\u00f4ng kh\u1edfi \u0111\u1ed9ng\n\nKi\u1ec3m tra:\n\n```bash\nkubectl describe pod loki-0 -n logging\n```\n\n\u0110\u1eb7c bi\u1ec7t ch\u00fa \u00fd c\u00e1c s\u1ef1 ki\u1ec7n (Events) \u1edf cu\u1ed1i k\u1ebft qu\u1ea3 \u0111\u1ec3 x\u00e1c \u0111\u1ecbnh nguy\u00ean nh\u00e2n.\n\n---\n\n## Kh\u00f4ng t\u00ecm th\u1ea5y Service\n\nKi\u1ec3m tra:\n\n```bash\nkubectl get svc -n logging\n```\n\nN\u1ebfu ch\u01b0a c\u00f3 Service, ki\u1ec3m tra l\u1ea1i Helm Release:\n\n```bash\nhelm status loki -n logging\n```\n\n---\n\n## Health Check kh\u00f4ng th\u00e0nh c\u00f4ng\n\nKi\u1ec3m tra log:\n\n```bash\nkubectl logs loki-0 -n logging\n```\n\n\u0110\u1ea3m b\u1ea3o Pod \u0111ang \u1edf tr\u1ea1ng th\u00e1i `Running` v\u00e0 Service \u0111\u00e3 \u0111\u01b0\u1ee3c t\u1ea1o.\n\n---\n\n# K\u1ebft qu\u1ea3 \u0111\u1ea1t \u0111\u01b0\u1ee3c\n\nSau ph\u1ea7n n\u00e0y, ch\u00fang ta \u0111\u00e3:\n\n* Tri\u1ec3n khai Loki tr\u00ean Kubernetes.\n* Hi\u1ec3u v\u00ec sao Loki s\u1eed d\u1ee5ng StatefulSet.\n* Ki\u1ec3m tra Pod v\u00e0 Service c\u1ee7a Loki.\n* X\u00e1c nh\u1eadn Loki \u0111\u00e3 s\u1eb5n s\u00e0ng nh\u1eadn log.\n* L\u00e0m quen v\u1edbi Endpoint v\u00e0 Metrics c\u1ee7a Loki.\n\nKi\u1ebfn tr\u00fac hi\u1ec7n t\u1ea1i:\n\n```text\n             Spring Boot\n                  \u2502\n           stdout \/ stderr\n                  \u2502\n           Kubernetes Node\n                  \u2502\n             Fluent Bit\n                  \u2502\n            (S\u1ebd c\u00e0i \u1edf Ph\u1ea7n 3)\n                  \u2502\n                  \u25bc\n                 Loki\n                  \u2502\n                  \u25bc\n               Grafana\n```\n\n\u1ede **Ph\u1ea7n 3**, ch\u00fang ta s\u1ebd tri\u1ec3n khai **Fluent Bit** d\u01b0\u1edbi d\u1ea1ng **DaemonSet**, c\u1ea5u h\u00ecnh Fluent Bit thu th\u1eadp log t\u1eeb t\u1ea5t c\u1ea3 c\u00e1c Pod trong Kubernetes v\u00e0 g\u1eedi ch\u00fang \u0111\u1ebfn Loki \u0111\u1ec3 x\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng Centralized Logging ho\u00e0n ch\u1ec9nh.","published_at":"2026-08-05T11:14:17.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T16:50:01.000000Z","edited_at":"2026-08-05T11:13:34.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":5,"points":0,"views_count":10,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/51a9fbe4-2d8c-4969-a3c0-10ba7c17abf2.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":59,"reputation":1181,"posts_count":100,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"fluent-bit","name":"Fluent Bit"},{"slug":"grafana","name":"grafana"},{"slug":"loki","name":"Loki"},{"slug":"kubernetes","name":"Kubernetes"}]},"commentators":{"data":[]}},{"id":104816,"title":"Lab 9.1 - X\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng Centralized Logging v\u1edbi Fluent Bit, Loki v\u00e0 Grafana","slug":"OQJwzaXN4MP","url":"https:\/\/viblo.asia\/p\/lab-91-xay-dung-he-thong-centralized-logging-voi-fluent-bit-loki-va-grafana-OQJwzaXN4MP","user_id":98940,"moderation":null,"transliterated":"lab-91-xay-dung-he-thong-centralized-logging-voi-fluent-bit-loki-va-grafana","contents_short":"Ph\u1ea7n 1 - T\u1ed5ng quan v\u1ec1 Logging trong Kubernetes\n\nSau khi ho\u00e0n th\u00e0nh Lab 8, ch\u00fang ta \u0111\u00e3 x\u00e2y d\u1ef1ng \u0111\u01b0\u1ee3c m\u1ed9t h\u1ec7 th\u1ed1ng Monitoring v\u00e0 Alerting ho\u00e0n ch\u1ec9nh.\n\nKhi h\u1ec7 th\u1ed1ng g\u1eb7p s\u1ef1 c\u1ed1, Prometheus s\u1ebd thu th\u1eadp Metrics, Alert Rule s\u1ebd ph\u00e1t hi\u1ec7n b\u1ea5t th\u01b0\u1eddng v\u00e0 Alertmanager s\u1ebd g\u1eedi c\u1ea3nh b\u00e1o \u0111\u1ebfn DevOps.\n\nV\u00ed d\u1ee5:\n\nL\u00fac n\u00e0y, DevOps \u0111\u00e3 bi\u1ebft r\u1eb1ng h\u1ec7 th\u1ed1ng \u0111ang c\u00f3 v\u1ea5n \u0111\u1ec1.\n\nNh\u01b0ng m\u1ed9t c\u00e2u h\u1ecfi quan tr\u1ecdng v\u1eabn ch\u01b0a c\u00f3 l\u1eddi gi\u1ea3i...","contents":"# Ph\u1ea7n 1 - T\u1ed5ng quan v\u1ec1 Logging trong Kubernetes\n\nSau khi ho\u00e0n th\u00e0nh Lab 8, ch\u00fang ta \u0111\u00e3 x\u00e2y d\u1ef1ng \u0111\u01b0\u1ee3c m\u1ed9t h\u1ec7 th\u1ed1ng Monitoring v\u00e0 Alerting ho\u00e0n ch\u1ec9nh.\n\nKhi h\u1ec7 th\u1ed1ng g\u1eb7p s\u1ef1 c\u1ed1, Prometheus s\u1ebd thu th\u1eadp Metrics, Alert Rule s\u1ebd ph\u00e1t hi\u1ec7n b\u1ea5t th\u01b0\u1eddng v\u00e0 Alertmanager s\u1ebd g\u1eedi c\u1ea3nh b\u00e1o \u0111\u1ebfn DevOps.\n\nV\u00ed d\u1ee5:\n\n```text\nAlert\n\nHighHTTP5xxRate\n\nSeverity: Critical\n```\n\nL\u00fac n\u00e0y, DevOps \u0111\u00e3 bi\u1ebft r\u1eb1ng h\u1ec7 th\u1ed1ng \u0111ang c\u00f3 v\u1ea5n \u0111\u1ec1.\n\nNh\u01b0ng m\u1ed9t c\u00e2u h\u1ecfi quan tr\u1ecdng v\u1eabn ch\u01b0a c\u00f3 l\u1eddi gi\u1ea3i:\n\n> **\u0110i\u1ec1u g\u00ec \u0111\u00e3 g\u00e2y ra s\u1ef1 c\u1ed1?**\n\n\u0110\u1ec3 tr\u1ea3 l\u1eddi c\u00e2u h\u1ecfi \u0111\u00f3, ch\u00fang ta c\u1ea7n \u0111\u1ebfn **Logs**.\n\n---\n\n# M\u1ee5c ti\u00eau c\u1ee7a ph\u1ea7n n\u00e0y\n\nSau ph\u1ea7n n\u00e0y, b\u1ea1n s\u1ebd hi\u1ec3u:\n\n* Logs l\u00e0 g\u00ec?\n* V\u00ec sao Kubernetes c\u1ea7n Centralized Logging?\n* Ki\u1ebfn tr\u00fac Logging trong Kubernetes.\n* Vai tr\u00f2 c\u1ee7a Fluent Bit, Loki v\u00e0 Grafana.\n* Quy tr\u00ecnh \u0111i\u1ec1u tra s\u1ef1 c\u1ed1 trong m\u00f4i tr\u01b0\u1eddng Production.\n\n---\n\n# Monitoring ch\u1ec9 cho bi\u1ebft \"C\u00f3 v\u1ea5n \u0111\u1ec1\"\n\nH\u00e3y quay l\u1ea1i t\u00ecnh hu\u1ed1ng th\u1ef1c t\u1ebf c\u1ee7a h\u1ec7 th\u1ed1ng Todo.\n\nM\u1ed9t bu\u1ed5i s\u00e1ng, Product Owner g\u1eedi tin nh\u1eafn:\n\n> \"Ng\u01b0\u1eddi d\u00f9ng ph\u1ea3n \u00e1nh API t\u1ea1o Todo r\u1ea5t ch\u1eadm.\"\n\nDevOps m\u1edf Grafana.\n\nDashboard hi\u1ec3n th\u1ecb:\n\n```text\nCPU:             35%\n\nMemory:          52%\n\nPod Restart:      0\n\nRequest Latency:  5.2s\n\nHTTP 500:         T\u0103ng m\u1ea1nh\n```\n\nNh\u00ecn v\u00e0o Dashboard, ch\u00fang ta bi\u1ebft:\n\n* \u1ee8ng d\u1ee5ng \u0111ang ph\u1ea3n h\u1ed3i ch\u1eadm.\n* S\u1ed1 l\u01b0\u1ee3ng l\u1ed7i HTTP 500 \u0111ang t\u0103ng.\n* Ng\u01b0\u1eddi d\u00f9ng th\u1ef1c s\u1ef1 \u0111ang b\u1ecb \u1ea3nh h\u01b0\u1edfng.\n\nTuy nhi\u00ean Dashboard kh\u00f4ng th\u1ec3 cho bi\u1ebft:\n\n* Exception n\u00e0o \u0111\u00e3 x\u1ea3y ra?\n* Database c\u00f3 b\u1ecb timeout kh\u00f4ng?\n* API n\u00e0o g\u00e2y l\u1ed7i?\n* Stack Trace l\u00e0 g\u00ec?\n* C\u00f3 l\u1ed7i NullPointerException hay kh\u00f4ng?\n\nN\u00f3i c\u00e1ch kh\u00e1c:\n\n**Metrics ch\u1ec9 cho bi\u1ebft *\u0111i\u1ec1u g\u00ec \u0111ang x\u1ea3y ra*, nh\u01b0ng kh\u00f4ng cho bi\u1ebft *t\u1ea1i sao* \u0111i\u1ec1u \u0111\u00f3 x\u1ea3y ra.**\n\n---\n\n# D\u00f9ng `kubectl logs` c\u00f3 \u0111\u1ee7 kh\u00f4ng?\n\nKhi m\u1edbi l\u00e0m quen v\u1edbi Kubernetes, h\u1ea7u h\u1ebft ch\u00fang ta \u0111\u1ec1u s\u1eed d\u1ee5ng:\n\n```bash\nkubectl logs <pod-name>\n```\n\nV\u00ed d\u1ee5:\n\n```bash\nkubectl logs todo-backend-7f9f8d9c6d-abc12 -n todo-app\n```\n\nK\u1ebft qu\u1ea3:\n\n```text\n2026-08-05 09:15:01 INFO  Application started\n\n2026-08-05 09:15:08 INFO  GET \/api\/todos\n\n2026-08-05 09:15:10 ERROR Database connection timeout\n```\n\nC\u00e1ch n\u00e0y ho\u1ea1t \u0111\u1ed9ng r\u1ea5t t\u1ed1t khi h\u1ec7 th\u1ed1ng c\u00f2n nh\u1ecf.\n\nV\u00ed d\u1ee5:\n\n```text\nFrontend\n\nBackend\n\nPostgreSQL\n```\n\nCh\u1ec9 c\u00f3 v\u00e0i Pod n\u00ean vi\u1ec7c ki\u1ec3m tra log kh\u00e1 \u0111\u01a1n gi\u1ea3n.\n\n---\n\n# V\u1ea5n \u0111\u1ec1 trong m\u00f4i tr\u01b0\u1eddng Production\n\nH\u00e3y t\u01b0\u1edfng t\u01b0\u1ee3ng h\u1ec7 th\u1ed1ng ph\u00e1t tri\u1ec3n sau v\u00e0i th\u00e1ng.\n\n```text\n20 Microservices\n\n\u2193\n\n120 Pods\n\n\u2193\n\n10 Kubernetes Nodes\n```\n\nM\u1ed9t Alert xu\u1ea5t hi\u1ec7n:\n\n```text\nHTTP 500 t\u0103ng cao\n```\n\nL\u00fac n\u00e0y DevOps s\u1ebd ph\u1ea3i:\n\n```text\nkubectl logs pod-1\n\nkubectl logs pod-2\n\nkubectl logs pod-3\n\n...\n\nkubectl logs pod-120\n```\n\nKh\u00f4ng ai mu\u1ed1n l\u00e0m \u0111i\u1ec1u \u0111\u00f3.\n\nKh\u00f3 kh\u0103n c\u00f2n l\u1edbn h\u01a1n khi:\n\n* Pod li\u00ean t\u1ee5c \u0111\u01b0\u1ee3c t\u1ea1o m\u1edbi.\n* Pod c\u0169 \u0111\u00e3 b\u1ecb x\u00f3a.\n* \u1ee8ng d\u1ee5ng ch\u1ea1y tr\u00ean nhi\u1ec1u Node kh\u00e1c nhau.\n* M\u1ed9t request \u0111i qua nhi\u1ec1u Microservice.\n\nVi\u1ec7c t\u00ecm log th\u1ee7 c\u00f4ng g\u1ea7n nh\u01b0 kh\u00f4ng c\u00f2n kh\u1ea3 thi.\n\n---\n\n# Centralized Logging l\u00e0 g\u00ec?\n\n\u0110\u1ec3 gi\u1ea3i quy\u1ebft v\u1ea5n \u0111\u1ec1 n\u00e0y, ch\u00fang ta c\u1ea7n t\u1eadp trung to\u00e0n b\u1ed9 log c\u1ee7a h\u1ec7 th\u1ed1ng v\u1ec1 m\u1ed9t n\u01a1i duy nh\u1ea5t.\n\n\u0110\u00f3 ch\u00ednh l\u00e0 **Centralized Logging**.\n\nThay v\u00ec \u0111\u0103ng nh\u1eadp v\u00e0o t\u1eebng m\u00e1y ch\u1ee7 ho\u1eb7c t\u1eebng Pod \u0111\u1ec3 xem log, DevOps ch\u1ec9 c\u1ea7n m\u1edf m\u1ed9t giao di\u1ec7n duy nh\u1ea5t v\u00e0 t\u00ecm ki\u1ebfm log c\u1ee7a to\u00e0n b\u1ed9 h\u1ec7 th\u1ed1ng.\n\nM\u00f4 h\u00ecnh n\u00e0y c\u00f3 th\u1ec3 h\u00ecnh dung nh\u01b0 sau:\n\n```text\nPod A\n\n      \u2502\n\nPod B\n\n      \u2502\n\nPod C\n\n      \u2502\n\nPod D\n\n      \u2502\n\n      \u25bc\n\nCentralized Logging\n\n      \u2502\n\n      \u25bc\n\nGrafana\n```\n\nD\u00f9 h\u1ec7 th\u1ed1ng c\u00f3 10 Pod hay 10.000 Pod, c\u00e1ch t\u00ecm log v\u1eabn ho\u00e0n to\u00e0n gi\u1ed1ng nhau.\n\n---\n\n# Logging trong Kubernetes ho\u1ea1t \u0111\u1ed9ng nh\u01b0 th\u1ebf n\u00e0o?\n\nM\u1ed9t \u0111i\u1ec3m r\u1ea5t kh\u00e1c gi\u1eefa Kubernetes v\u00e0 c\u00e1c h\u1ec7 th\u1ed1ng truy\u1ec1n th\u1ed1ng l\u00e0:\n\n**Container kh\u00f4ng n\u00ean ghi log ra file.**\n\nThay v\u00e0o \u0111\u00f3, \u1ee9ng d\u1ee5ng n\u00ean ghi log tr\u1ef1c ti\u1ebfp ra:\n\n* stdout\n* stderr\n\nV\u00ed d\u1ee5 v\u1edbi Spring Boot:\n\n```java\nlog.info(\"Create Todo successfully\");\n\nlog.error(\"Database connection timeout\");\n```\n\nKhi \u1ee9ng d\u1ee5ng ch\u1ea1y trong Container, c\u00e1c log n\u00e0y s\u1ebd xu\u1ea5t hi\u1ec7n tr\u00ean Console:\n\n```text\nINFO  Create Todo successfully\n\nERROR Database connection timeout\n```\n\nContainer Runtime (Docker ho\u1eb7c containerd) s\u1ebd t\u1ef1 \u0111\u1ed9ng l\u01b0u c\u00e1c log n\u00e0y tr\u00ean Node.\n\nLu\u1ed3ng ho\u1ea1t \u0111\u1ed9ng:\n\n```text\nSpring Boot\n\n      \u2502\n\nstdout \/ stderr\n\n      \u2502\n\nContainer Runtime\n\n      \u2502\n\n\/var\/log\/containers\n\n      \u2502\n\nLog Collector\n```\n\nCh\u00ednh v\u00ec v\u1eady, trong Kubernetes ch\u00fang ta **kh\u00f4ng c\u1ea7n t\u1ef1 t\u1ea1o file log** nh\u01b0:\n\n```text\napplication.log\n\nserver.log\n\nerror.log\n```\n\nVi\u1ec7c ghi log ra Console l\u00e0 \u0111\u1ee7.\n\n---\n\n# V\u00ec sao kh\u00f4ng n\u00ean ghi log v\u00e0o file trong Container?\n\n\u0110\u00e2y l\u00e0 m\u1ed9t sai l\u1ea7m kh\u00e1 ph\u1ed5 bi\u1ebfn khi m\u1edbi l\u00e0m vi\u1ec7c v\u1edbi Docker v\u00e0 Kubernetes.\n\nV\u00ed d\u1ee5:\n\n```text\n\/app\/logs\/application.log\n```\n\nTho\u1ea1t nh\u00ecn c\u00f3 v\u1ebb h\u1ee3p l\u00fd.\n\nTuy nhi\u00ean khi Pod b\u1ecb x\u00f3a:\n\n```bash\nkubectl delete pod todo-backend\n```\n\nContainer c\u0169ng b\u1ecb x\u00f3a theo.\n\nTo\u00e0n b\u1ed9 file log s\u1ebd bi\u1ebfn m\u1ea5t.\n\nTrong khi \u0111\u00f3, n\u1ebfu ghi log ra stdout, Log Collector s\u1ebd g\u1eedi log t\u1edbi h\u1ec7 th\u1ed1ng l\u01b0u tr\u1eef ngay sau khi log \u0111\u01b0\u1ee3c sinh ra.\n\nNh\u1edd \u0111\u00f3 log v\u1eabn \u0111\u01b0\u1ee3c l\u01b0u gi\u1eef ngay c\u1ea3 khi Pod kh\u00f4ng c\u00f2n t\u1ed3n t\u1ea1i.\n\n---\n\n# Ki\u1ebfn tr\u00fac Logging trong Lab n\u00e0y\n\nTrong Lab 9, ch\u00fang ta s\u1ebd x\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng Logging theo ki\u1ebfn tr\u00fac sau:\n\n```text\n                Spring Boot\n\n                     \u2502\n\n               stdout \/ stderr\n\n                     \u2502\n\n              Kubernetes Node\n\n                     \u2502\n\n                Fluent Bit\n\n                     \u2502\n\n                    Loki\n\n                     \u2502\n\n                  Grafana\n\n                     \u2502\n\n              Search & Analysis\n```\n\nM\u1ed7i th\u00e0nh ph\u1ea7n \u0111\u1ec1u c\u00f3 m\u1ed9t vai tr\u00f2 ri\u00eang.\n\n---\n\n# Fluent Bit\n\nFluent Bit l\u00e0 **Log Collector**.\n\nN\u00f3 ch\u1ea1y tr\u00ean m\u1ed7i Kubernetes Node d\u01b0\u1edbi d\u1ea1ng **DaemonSet**.\n\nNhi\u1ec7m v\u1ee5 c\u1ee7a Fluent Bit:\n\n* Theo d\u00f5i log c\u1ee7a t\u1ea5t c\u1ea3 Container tr\u00ean Node.\n* \u0110\u1ecdc log m\u1edbi ngay khi \u0111\u01b0\u1ee3c t\u1ea1o.\n* Th\u00eam Metadata c\u1ee7a Kubernetes.\n* G\u1eedi log t\u1edbi Loki.\n\nV\u00ed d\u1ee5:\n\nLog ban \u0111\u1ea7u:\n\n```text\nERROR Database connection timeout\n```\n\nSau khi Fluent Bit x\u1eed l\u00fd:\n\n```json\n{\n  \"namespace\": \"todo-app\",\n  \"pod\": \"todo-backend-6f9b4d7f7d-abc12\",\n  \"container\": \"backend\",\n  \"level\": \"ERROR\",\n  \"message\": \"Database connection timeout\"\n}\n```\n\nNh\u1edd c\u00f3 Metadata n\u00e0y, ch\u00fang ta c\u00f3 th\u1ec3 t\u00ecm ki\u1ebfm log theo:\n\n* Namespace.\n* Pod.\n* Container.\n* Node.\n* Label c\u1ee7a \u1ee9ng d\u1ee5ng.\n\n---\n\n# Loki\n\nLoki l\u00e0 h\u1ec7 th\u1ed1ng l\u01b0u tr\u1eef v\u00e0 t\u00ecm ki\u1ebfm log do Grafana Labs ph\u00e1t tri\u1ec3n.\n\nKh\u00e1c v\u1edbi c\u00e1c h\u1ec7 th\u1ed1ng truy\u1ec1n th\u1ed1ng nh\u01b0 Elasticsearch, Loki **kh\u00f4ng \u0111\u00e1nh ch\u1ec9 m\u1ee5c to\u00e0n b\u1ed9 n\u1ed9i dung log**.\n\nThay v\u00e0o \u0111\u00f3, Loki ch\u1ec9 \u0111\u00e1nh ch\u1ec9 m\u1ee5c c\u00e1c **Label** nh\u01b0:\n\n```text\nnamespace=\"todo-app\"\n\napp=\"todo-backend\"\n\ncontainer=\"backend\"\n```\n\n\u0110i\u1ec1u n\u00e0y gi\u00fap Loki:\n\n* S\u1eed d\u1ee5ng \u00edt t\u00e0i nguy\u00ean h\u01a1n.\n* Ti\u1ebft ki\u1ec7m dung l\u01b0\u1ee3ng l\u01b0u tr\u1eef.\n* T\u1ed1i \u01b0u cho m\u00f4i tr\u01b0\u1eddng Kubernetes.\n\n---\n\n# Grafana\n\nGrafana kh\u00f4ng ch\u1ec9 hi\u1ec3n th\u1ecb Dashboard Metrics.\n\nSau khi k\u1ebft n\u1ed1i v\u1edbi Loki, Grafana c\u00f2n cho ph\u00e9p:\n\n* T\u00ecm ki\u1ebfm log.\n* L\u1ecdc log theo Namespace, Pod ho\u1eb7c Container.\n* Ph\u00e2n t\u00edch log theo th\u1eddi gian.\n* Li\u00ean k\u1ebft tr\u1ef1c ti\u1ebfp gi\u1eefa Metrics v\u00e0 Logs.\n\nV\u00ed d\u1ee5:\n\nDashboard cho th\u1ea5y Request Latency t\u0103ng.\n\nCh\u1ec9 v\u1edbi m\u1ed9t c\u00fa nh\u1ea5p chu\u1ed9t, DevOps c\u00f3 th\u1ec3 chuy\u1ec3n sang xem log c\u1ee7a Pod t\u01b0\u01a1ng \u1ee9ng v\u00e0 t\u00ecm ra nguy\u00ean nh\u00e2n.\n\n---\n\n# T\u1eeb Metrics \u0111\u1ebfn Root Cause\n\n\u0110\u00e2y ch\u00ednh l\u00e0 quy tr\u00ecnh \u0111i\u1ec1u tra s\u1ef1 c\u1ed1 trong th\u1ef1c t\u1ebf.\n\n```text\nNg\u01b0\u1eddi d\u00f9ng b\u00e1o l\u1ed7i\n\n        \u2502\n\n        \u25bc\n\nAlertmanager g\u1eedi c\u1ea3nh b\u00e1o\n\n        \u2502\n\n        \u25bc\n\nGrafana Dashboard\n\n        \u2502\n\n        \u25bc\n\nRequest Latency t\u0103ng\n\n        \u2502\n\n        \u25bc\n\nM\u1edf Logs tr\u00ean Grafana\n\n        \u2502\n\n        \u25bc\n\nERROR Database connection timeout\n\n        \u2502\n\n        \u25bc\n\nX\u00e1c \u0111\u1ecbnh nguy\u00ean nh\u00e2n g\u1ed1c\n\n        \u2502\n\n        \u25bc\n\nKh\u1eafc ph\u1ee5c s\u1ef1 c\u1ed1\n```\n\nThay v\u00ec m\u1ea5t h\u00e0ng ch\u1ee5c ph\u00fat \u0111\u1ec3 SSH v\u00e0o t\u1eebng m\u00e1y ch\u1ee7 v\u00e0 ki\u1ec3m tra log th\u1ee7 c\u00f4ng, DevOps ch\u1ec9 c\u1ea7n v\u00e0i ph\u00fat \u0111\u1ec3 x\u00e1c \u0111\u1ecbnh nguy\u00ean nh\u00e2n.\n\n---\n\n# Nh\u1eefng g\u00ec ch\u00fang ta s\u1ebd x\u00e2y d\u1ef1ng trong Lab 9\n\nTrong c\u00e1c ph\u1ea7n ti\u1ebfp theo c\u1ee7a Lab, ch\u00fang ta s\u1ebd l\u1ea7n l\u01b0\u1ee3t:\n\n* Tri\u1ec3n khai Loki b\u1eb1ng Helm.\n* Tri\u1ec3n khai Fluent Bit d\u01b0\u1edbi d\u1ea1ng DaemonSet.\n* Thu th\u1eadp log t\u1eeb t\u1ea5t c\u1ea3 Pod trong Kubernetes.\n* K\u1ebft n\u1ed1i Loki v\u1edbi Grafana.\n* S\u1eed d\u1ee5ng LogQL \u0111\u1ec3 t\u00ecm ki\u1ebfm log.\n* \u0110i\u1ec1u tra m\u1ed9t s\u1ef1 c\u1ed1 th\u1ef1c t\u1ebf c\u1ee7a \u1ee9ng d\u1ee5ng Todo.\n* K\u1ebft h\u1ee3p **Metrics + Alerts + Logs** \u0111\u1ec3 ho\u00e0n thi\u1ec7n h\u1ec7 th\u1ed1ng **Observability**.\n\nSau khi ho\u00e0n th\u00e0nh Lab 9, b\u1ea1n s\u1ebd c\u00f3 m\u1ed9t n\u1ec1n t\u1ea3ng Logging t\u01b0\u01a1ng t\u1ef1 nh\u01b0 c\u00e1ch nhi\u1ec1u h\u1ec7 th\u1ed1ng Kubernetes Production \u0111ang v\u1eadn h\u00e0nh, n\u01a1i m\u1ecdi log c\u1ee7a \u1ee9ng d\u1ee5ng \u0111\u1ec1u \u0111\u01b0\u1ee3c thu th\u1eadp, l\u01b0u tr\u1eef v\u00e0 tra c\u1ee9u t\u1eadp trung t\u1eeb m\u1ed9t giao di\u1ec7n duy nh\u1ea5t.","published_at":"2026-08-05T11:12:37.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T17:00:25.000000Z","edited_at":"2026-08-05T11:10:28.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":7,"points":0,"views_count":6,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/289e230a-ab00-45ae-98f5-b9fbcb47a83a.png","user":{"data":{"id":98940,"url":"https:\/\/viblo.asia\/u\/Juu-dev","avatar":"25478754-6f7c-425c-a27d-bd61fabc134e.jpg","name":"Th\u1ed1ng PM","username":"Juu-dev","followers_count":59,"reputation":1181,"posts_count":100,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"fluent-bit","name":"Fluent Bit"},{"slug":"grafana","name":"grafana"},{"slug":"loki","name":"Loki"},{"slug":"kubernetes","name":"Kubernetes"}]},"commentators":{"data":[]}},{"id":104815,"title":"Ph\u00e2n bi\u1ec7t whereDate() v\u00e0 where() trong Laravel Query Builder v\u1edbi MySQL","slug":"oW4oenNoLml","url":"https:\/\/viblo.asia\/p\/phan-biet-wheredate-va-where-trong-laravel-query-builder-voi-mysql-oW4oenNoLml","user_id":182653,"moderation":null,"transliterated":"phan-biet-wheredate-va-where-trong-laravel-query-builder-voi-mysql","contents_short":"Khi l\u00e0m vi\u1ec7c v\u1edbi c\u00e1c c\u1ed9t ki\u1ec3u d\u1eef li\u1ec7u th\u1eddi gian (TIMESTAMP ho\u1eb7c DATETIME) trong Laravel, vi\u1ec7c l\u1ecdc d\u1eef li\u1ec7u theo ng\u00e0y th\u00e1ng l\u00e0 m\u1ed9t nhu c\u1ea7u c\u1ef1c k\u1ef3 ph\u1ed5 bi\u1ebfn. Tuy nhi\u00ean, r\u1ea5t nhi\u1ec1u l\u1eadp tr\u00ecnh vi\u00ean th\u01b0\u1eddng v\u00f4 t\u00ecnh d\u00f9ng nh\u1ea7m gi\u1eefa hai ph\u01b0\u01a1ng th\u1ee9c where() v\u00e0 whereDate(), d\u1eabn \u0111\u1ebfn nh\u1eefng l\u1ed7i kh\u00f3 hi\u1ec3u kh\u00f4ng t\u00ecm ra k\u1ebft qu\u1ea3.\n\nD\u01b0\u1edbi \u0111\u00e2y l\u00e0 b\u1ee9c tranh chi ti\u1ebft v\u1ec1 s\u1ef1 kh\u00e1c bi\u1ec7t c\u1ed1t l\u00f5i gi\u1eefa hai ph\u01b0\u01a1ng th\u1ee9c n\u00e0y.\n\n1. B\u1ea3...","contents":"Khi l\u00e0m vi\u1ec7c v\u1edbi c\u00e1c c\u1ed9t ki\u1ec3u d\u1eef li\u1ec7u th\u1eddi gian (`TIMESTAMP` ho\u1eb7c `DATETIME`) trong Laravel, vi\u1ec7c l\u1ecdc d\u1eef li\u1ec7u theo ng\u00e0y th\u00e1ng l\u00e0 m\u1ed9t nhu c\u1ea7u c\u1ef1c k\u1ef3 ph\u1ed5 bi\u1ebfn. Tuy nhi\u00ean, r\u1ea5t nhi\u1ec1u l\u1eadp tr\u00ecnh vi\u00ean th\u01b0\u1eddng v\u00f4 t\u00ecnh d\u00f9ng nh\u1ea7m gi\u1eefa hai ph\u01b0\u01a1ng th\u1ee9c `where()` v\u00e0 `whereDate()`, d\u1eabn \u0111\u1ebfn nh\u1eefng l\u1ed7i kh\u00f3 hi\u1ec3u kh\u00f4ng t\u00ecm ra k\u1ebft qu\u1ea3.\n\nD\u01b0\u1edbi \u0111\u00e2y l\u00e0 b\u1ee9c tranh chi ti\u1ebft v\u1ec1 s\u1ef1 kh\u00e1c bi\u1ec7t c\u1ed1t l\u00f5i gi\u1eefa hai ph\u01b0\u01a1ng th\u1ee9c n\u00e0y.\n\n---\n\n## 1. B\u1ea3n ch\u1ea5t & C\u00e1ch ho\u1ea1t \u0111\u1ed9ng\n\n### `whereDate()`\n*   **C\u00e1ch ho\u1ea1t \u0111\u1ed9ng:** Ph\u01b0\u01a1ng th\u1ee9c n\u00e0y s\u1ebd ch\u1ee7 \u0111\u1ed9ng \u00e9p ki\u1ec3u c\u1ed9t d\u1eef li\u1ec7u trong c\u01a1 s\u1edf d\u1eef li\u1ec7u v\u1ec1 d\u1ea1ng Ng\u00e0y (ch\u1ec9 l\u1ea5y ph\u1ea7n `YYYY-MM-DD`, t\u1ef1 \u0111\u1ed9ng b\u1ecf qua ph\u1ea7n Gi\u1edd:Ph\u00fat:Gi\u00e2y) r\u1ed3i m\u1edbi ti\u1ebfn h\u00e0nh so s\u00e1nh v\u1edbi gi\u00e1 tr\u1ecb truy\u1ec1n v\u00e0o.\n*   **C\u00e2u l\u1ec7nh SQL t\u01b0\u01a1ng \u0111\u01b0\u01a1ng (MySQL):**\n    ```sql\n    SELECT * FROM posts WHERE DATE(created_at) = '2024-12-18';\n    ```\n\n### `where()`\n*   **C\u00e1ch ho\u1ea1t \u0111\u1ed9ng:** So s\u00e1nh tr\u1ef1c ti\u1ebfp gi\u00e1 tr\u1ecb c\u1ee7a c\u1ed9t v\u1edbi gi\u00e1 tr\u1ecb b\u1ea1n truy\u1ec1n v\u00e0o d\u1ef1a tr\u00ean c\u01a1 ch\u1ebf \u00e9p ki\u1ec3u t\u1ef1 \u0111\u1ed9ng c\u1ee7a MySQL.\n*   **H\u1ec7 qu\u1ea3:** N\u1ebfu c\u1ed9t `created_at` c\u00f3 ki\u1ec3u `DATETIME` ho\u1eb7c `TIMESTAMP` (v\u00ed d\u1ee5 l\u01b0u gi\u00e1 tr\u1ecb `2024-12-18 14:30:00`) m\u00e0 b\u1ea1n d\u00f9ng `where('created_at', '2024-12-18')`, MySQL s\u1ebd ng\u1ea7m hi\u1ec3u ho\u1eb7c \u00e9p gi\u00e1 tr\u1ecb b\u00ean ph\u1ea3i v\u1ec1 `2024-12-18 00:00:00`. K\u1ebft qu\u1ea3 l\u00e0 n\u00f3 s\u1ebd \u0111i t\u00ecm ch\u00ednh x\u00e1c c\u00e1c b\u1ea3n ghi \u0111\u01b0\u1ee3c t\u1ea1o \u0111\u00fang v\u00e0o l\u00fac 0h00 ph\u00fat 00 gi\u00e2y c\u1ee7a ng\u00e0y h\u00f4m \u0111\u00f3, khi\u1ebfn c\u00e2u l\u1ec7nh tr\u1ea3 v\u1ec1 m\u1ea3ng r\u1ed7ng (`[]`).\n\n---\n\n## 2. Tr\u01b0\u1eddng h\u1ee3p th\u1ef1c t\u1ebf: L\u1ea5y to\u00e0n b\u1ed9 b\u00e0i vi\u1ebft trong \"ng\u00e0y h\u00f4m nay\"\n\nGi\u1ea3 s\u1eed b\u1ea1n c\u1ea7n vi\u1ebft m\u1ed9t c\u00e2u l\u1ec7nh \u0111\u1ec3 l\u1ea5y t\u1ea5t c\u1ea3 c\u00e1c b\u00e0i vi\u1ebft \u0111\u01b0\u1ee3c t\u1ea1o ra trong ng\u00e0y h\u00f4m nay, b\u1ea5t k\u1ec3 l\u00e0 l\u00fac s\u00e1ng s\u1edbm hay n\u1eeda \u0111\u00eam.\n\n### \u274c Tr\u01b0\u1eddng h\u1ee3p KH\u00d4NG N\u00caN D\u00d9NG: `where()`\n```php\nuse App\\Models\\Post;\nuse Carbon\\Carbon;\n\n\/\/ K\u1ebft qu\u1ea3 th\u01b0\u1eddng s\u1ebd l\u00e0 m\u1ea3ng r\u1ed7ng []\n$posts = Post::where('created_at', Carbon::today())->get();\n```\n*   **L\u00fd do l\u1ed7i:** `Carbon::today()` khi \u00e9p sang d\u1ea1ng chu\u1ed7i s\u1ebd tr\u1ea3 v\u1ec1 `2024-12-18 00:00:00`. Khi k\u1ebft h\u1ee3p v\u1edbi h\u00e0m `where()`, c\u00e2u l\u1ec7nh SQL sinh ra s\u1ebd l\u00e0 `WHERE created_at = '2024-12-18 00:00:00'`, ho\u00e0n to\u00e0n b\u1ecf l\u1ee1 c\u00e1c b\u00e0i vi\u1ebft t\u1ea1o v\u00e0o bu\u1ed5i chi\u1ec1u hay bu\u1ed5i t\u1ed1i.\n\n### \u2705 Tr\u01b0\u1eddng h\u1ee3p N\u00caN D\u00d9NG: `whereDate()`\n```php\nuse App\\Models\\Post;\nuse Carbon\\Carbon;\n\n\/\/ L\u1ea5y to\u00e0n b\u1ed9 b\u00e0i vi\u1ebft trong ng\u00e0y h\u00f4m nay m\u1ed9t c\u00e1ch chu\u1ea9n x\u00e1c\n$posts = Post::whereDate('created_at', Carbon::today())->get();\n```\n*   **L\u00fd do ch\u00ednh x\u00e1c:** Laravel s\u1ebd t\u1ef1 \u0111\u1ed9ng c\u1eaft ph\u1ea7n gi\u1edd gi\u1ea5c c\u1ee7a c\u1ed9t `created_at` \u0111i \u0111\u1ec3 so s\u00e1nh thu\u1ea7n t\u00fay ph\u1ea7n ng\u00e0y th\u00e1ng (`YYYY-MM-DD`), gi\u00fap b\u1ea1n gom tr\u1ecdn v\u1eb9n t\u1ea5t c\u1ea3 b\u00e0i vi\u1ebft t\u1eeb `00:00:00` \u0111\u1ebfn `23:59:59` trong ng\u00e0y.\n\n---\n\n## 3. L\u01b0u \u00fd quan tr\u1ecdng v\u1ec1 Hi\u1ec7u n\u0103ng (Performance) khi d\u00f9ng whereDate()\n\nM\u1eb7c d\u00f9 `whereDate()` mang l\u1ea1i s\u1ef1 ti\u1ec7n l\u1ee3i v\u00e0 ch\u00ednh x\u00e1c v\u1ec1 m\u1eb7t logic nghi\u1ec7p v\u1ee5, b\u1ea1n c\u1ea7n l\u01b0u \u00fd m\u1ed9t \u0111i\u1ec3m v\u1ec1 hi\u1ec7u n\u0103ng c\u01a1 s\u1edf d\u1eef li\u1ec7u:\n\n*   Khi b\u1ea1n d\u00f9ng h\u00e0m `DATE(created_at)` trong MySQL, MySQL s\u1ebd **kh\u00f4ng th\u1ec3 s\u1eed d\u1ee5ng Index** (ch\u1ec9 m\u1ee5c) \u0111\u00e3 t\u1ea1o tr\u00ean c\u1ed9t `created_at` \u0111\u00f3 n\u1eefa (hi\u1ec7n t\u01b0\u1ee3ng n\u00e0y g\u1ecdi l\u00e0 *Index Scans disabled*).\n*   N\u1ebfu b\u1ea3ng `posts` c\u1ee7a b\u1ea1n c\u00f3 h\u00e0ng tri\u1ec7u b\u1ea3n ghi, c\u00e2u l\u1ec7nh s\u1eed d\u1ee5ng `whereDate()` s\u1ebd khi\u1ebfn MySQL ph\u1ea3i qu\u00e9t to\u00e0n b\u1ed9 b\u1ea3ng (*Full Table Scan*), l\u00e0m gi\u1ea3m hi\u1ec7u n\u0103ng h\u1ec7 th\u1ed1ng.\n\n### \ud83d\udca1 Gi\u1ea3i ph\u00e1p t\u1ed1i \u01b0u cho b\u1ea3ng d\u1eef li\u1ec7u l\u1edbn:\nThay v\u00ec d\u00f9ng `whereDate()`, n\u1ebfu mu\u1ed1n t\u1eadn d\u1ee5ng Index c\u1ee7a c\u01a1 s\u1edf d\u1eef li\u1ec7u \u0111\u1ec3 query si\u00eau nhanh, b\u1ea1n n\u00ean d\u00f9ng kho\u1ea3ng th\u1eddi gian (`whereBetween`):\n\n```php\n$posts = Post::whereBetween('created_at', [\n    Carbon::today()->startOfDay(), \/\/ 2024-12-18 00:00:00\n    Carbon::today()->endOfDay()    \/\/ 2024-12-18 23:59:59\n])->get();\n```\n\nC\u00e1ch vi\u1ebft n\u00e0y v\u1eeba \u0111\u1ea3m b\u1ea3o l\u1ea5y ch\u00ednh x\u00e1c d\u1eef li\u1ec7u trong ng\u00e0y, v\u1eeba gi\u00fap MySQL t\u1eadn d\u1ee5ng \u0111\u01b0\u1ee3c Index tr\u00ean c\u1ed9t `created_at`.\n\n---\n\n## T\u1ed5ng k\u1ebft\n\n*   D\u00f9ng `where()` khi b\u1ea1n mu\u1ed1n so s\u00e1nh ch\u00ednh x\u00e1c tuy\u1ec7t \u0111\u1ed1i c\u1ea3 th\u1eddi gian (ng\u00e0y, gi\u1edd, ph\u00fat, gi\u00e2y).\n*   D\u00f9ng `whereDate()` khi b\u1ea1n ch\u1ec9 mu\u1ed1n so s\u00e1nh ph\u1ea7n Ng\u00e0y th\u00e1ng n\u0103m, c\u1ef1c k\u1ef3 ph\u00f9 h\u1ee3p cho c\u00e1c b\u00e0i to\u00e1n l\u1ecdc theo ng\u00e0y, th\u00e1ng, n\u0103m sinh ho\u1eb7c l\u1ea5y d\u1eef li\u1ec7u trong ng\u00e0y.\n*   \u0110\u1ed1i v\u1edbi c\u00e1c b\u1ea3ng d\u1eef li\u1ec7u c\u1ef1c l\u1edbn, h\u00e3y \u01b0u ti\u00ean d\u00f9ng `whereBetween()` k\u1ebft h\u1ee3p v\u1edbi kho\u1ea3ng th\u1eddi gian \u0111\u1ea7u ng\u00e0y v\u00e0 cu\u1ed1i ng\u00e0y \u0111\u1ec3 t\u1ed1i \u01b0u hi\u1ec7u n\u0103ng Database.","published_at":"2026-08-05T09:50:38.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T16:14:04.000000Z","edited_at":"2026-08-05T09:50:36.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":4,"points":0,"views_count":10,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/1c4be973-84ab-406d-b640-755084cbed9b.png","user":{"data":{"id":182653,"url":"https:\/\/viblo.asia\/u\/hhoang","avatar":"15b74a7e-16dd-435c-b375-62f02864e065.jpg","name":"Nguy\u1ec5n Huy Ho\u00e0ng","username":"hhoang","followers_count":144,"reputation":11227,"posts_count":987,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"query-builder","name":"Query builder"}]},"commentators":{"data":[]}},{"id":104814,"title":"Buy Negative Trustpilot Reviews","slug":"vbLbjpmmLnk","url":"https:\/\/viblo.asia\/p\/buy-negative-trustpilot-reviews-vbLbjpmmLnk","user_id":201830,"moderation":"discarded","transliterated":"buy-negative-trustpilot-reviews","contents_short":"Customer evaluations serve a vital function regarding the standing of your company. Yet, a single bad comment might ruin your picture and stop future buyers. Within current digital times, internet comments hold huge power, so handling your web status works well. Here now, we look at the debated act of getting bad Trustpilot ratings. We examine why firms pick this strange path, what happens duri...","contents":"Customer evaluations serve a vital function regarding the standing of your company. Yet, a single bad comment might ruin your picture and stop future buyers. Within current digital times, internet comments hold huge power, so handling your web status works well. Here now, we look at the debated act of getting bad Trustpilot ratings. We examine why firms pick this strange path, what happens during buying poor data, and how using these scores may unexpectedly help good results for your mark expansion progress.\nIf you want to more information just contact now.\n24 Hours Reply\/Contact\n\u2705Telegram: @smmusareview\n\u2705WhatsApp: +44 7478079809\n\u2705E-mail: smmusareview24h@gmail.com\n\u2705Website: https:\/\/smmusareview.com\/product\/buy-negative-trustpilot-reviews\/\nThe Power of Negative Trustpilot Reviews\nAlthough many assume good ratings fuel commercial achievement, bad Trustpilot comments possess distinct influence. They offer useful data regarding zones needing enhancement and assist firms in spotting flaws within goods or offerings. Accepting unfavorable remarks through an open perspective may result in major expansion and better client happiness. Bad entries on Trustpilot furthermore contribute truthfulness and reliability to a firm digital existence. Shoppers tend to believe a corporation showing both favorable and poor input, since this indicates openness and readiness to fix problems. Through recognizing and resolving bad Trustpilot comments, enterprises can show dedication toward ongoing progress, finally creating tighter bonds with clients.\nWhy You Should Consider Buying Negative Trustpilot Reviews\nAlthough acquiring bad Trustpilot comments might look strange, it works well to boost how people see you online. Putting some low scores on your page makes your company feel real and believable to others. People doubt flawless marks usually, yet including a couple of poor ones lets good ratings seem more honest too. Also, getting bad Trustpilot reviews gives useful data about parts of work needing better care here. Such complaints act as helpful notes helping you find flaws and fix them before things get worse. Accepting bad remarks tells clients you care about being open and growing forever, which builds faith and support over time eventually.\nFinding the Right Service Provider\nIf looking for a vendor to help get bad Trustpilot ratings, one must do deep study. Search for good firms showing history giving solid work inside moral lines. See customer comments and feedback to judge trust and dependability. Also, make sure the firm gives choices made for your exact wants. Openness and plain talking matter most when picking the correct ally for this tricky job. Picking a reliable and skilled vendor lets you move through the world of poor Trustpilot scores with faith and reach goals well done.\nPlacing Your Order\nRegarding buying bad Trustpilot reviews, one must act with care and exactness. Once choosing a trustworthy vendor, clearly state specifics regarding reviews meant for posting. Define goals precisely so wording matches brand tone and voice. Contact remains vital here; remain connected with supplier to handle issues or queries appearing. Check examples of suggested bad reviews prior to release to verify they fit criteria. Through active engagement at this step, you prepare for success by making sure bought reviews send intended message properly.\nUnderstanding the Impact of Negative Reviews\nWithin online reputation management, bad Trustpilot reviews hold great sway over buyer views and faith. Such harsh assessments may ruin your brand picture, stop possible clients, and hurt your trustworthiness in the web world. One must realize that poor reviews possess ability to mold public thought and affect buying choices. Yet, seeing bad Trustpilot comments via another angle shows chance for development and betterment. Accepting useful critique might bring important knowledge which aids finding spots needing fixing inside your firm. Through recognizing such negative remarks as helpful data instead of failures, one can aim for greatness and show dedication to client happiness that rings true well with your crowd.\nLeveraging Negative Trustpilot Reviews to Improve Your Business\nTaking negative Trustpilot reviews seriously might help grow your company. Fixing problems shown in such comments shows honesty and care for client happiness. Doing this early gets unhappy clients back and proves you want better results always. Also, bad reviews give good clues about parts needing work inside your firm. Looking at repeated topics or complaints helps find secret flaws so you fix them to raise product or service levels generally. Taking all feedback, good or bad, makes your firm seem open to user thoughts and ready to offer great moments.\nMonitoring and Managing Your Reviews\nAfter getting bad Trustpilot reviews for your company, the following vital action is to properly track and handle them. Frequently look at your Trustpilot page to view how clients engage with the poor comments. Reply quickly and professionally to all input, solving problems and showing dedication to client happiness. Treat the bad reviews as chances for development and betterment. Examine frequent topics or matters noted in the comments and make forward moves to fix them inside your business tasks. Through handling your reviews actively, you can show openness, responsibility, and a true wish to improve the total client journey.\nEmbracing the Feedback Loop\nWithin the domain of adverse Trustpilot comments, the response cycle acts as a key instrument for ongoing betterment. Instead of seeing bad input as a failure, treat it as a prime chance to upgrade goods or services. Through direct interaction with unhappy clients and fixing issues quickly, you show devotion to quality and build reliability. Accepting the cycle means reacting to poor ratings plus making shifts using helpful advice. Each comment offers a way to polish products and reveal focus on client happiness. Keep in mind, inside each grievance sits useful knowledge which drives invention and expansion.\nConclusion\nAs we finish looking at purchasing bad Trustpilot reviews, one must recall that each problem offers chances for development. Accepting comments, if good or poor, might bring useful knowledge and changes to company plans. Through knowing how reviews affect things and handling them well, people can make hard times helpful and create a better, tougher online business look.","published_at":"2026-08-05T09:36:01.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T09:36:09.000000Z","edited_at":"2026-08-05T09:32:26.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":4,"points":0,"views_count":0,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/104994b9-43d4-4fd4-8658-8fd842220b0a.png","user":{"data":{"id":201830,"url":"https:\/\/viblo.asia\/u\/wallie.asbury","avatar":"37de1acd-8926-483d-8731-d13175971855.jpg","name":"Sheila Hicks","username":"wallie.asbury","followers_count":0,"reputation":0,"posts_count":0,"banned_at":"2026-08-05T09:36:03.000000Z","level_partner":null,"following":false}},"tags":{"data":[{"slug":"buy-negative-trustpilot-reviews","name":"Buy Negative Trustpilot Reviews"}]},"commentators":{"data":[]}},{"id":104797,"title":"H\u00e0m set_time_limit(0) trong PHP l\u00e0 g\u00ec? C\u00f4ng d\u1ee5ng, r\u1ee7i ro v\u00e0 c\u00e1ch d\u00f9ng chu\u1ea9n ch\u1ec9nh","slug":"PoL7ebjX4vk","url":"https:\/\/viblo.asia\/p\/ham-set-time-limit0-trong-php-la-gi-cong-dung-rui-ro-va-cach-dung-chuan-chinh-PoL7ebjX4vk","user_id":182653,"moderation":null,"transliterated":"ham-set-time-limit0-trong-php-la-gi-cong-dung-rui-ro-va-cach-dung-chuan-chinh","contents_short":"Khi ph\u00e1t tri\u1ec3n c\u00e1c \u1ee9ng d\u1ee5ng web b\u1eb1ng PHP, ch\u1eafc ch\u1eafn c\u00f3 l\u00fac b\u1ea1n ch\u1ea1m ph\u1ea3i l\u1ed7i th\u1ea3m h\u1ecda:\nFatal error: Maximum execution time of 30 seconds exceeded [cite: x]\n\nL\u1ed7i n\u00e0y xu\u1ea5t hi\u1ec7n khi m\u1ed9t t\u1eadp tin PHP ch\u1ea1y qu\u00e1 th\u1eddi gian cho ph\u00e9p c\u1ee7a m\u00e1y ch\u1ee7 (m\u1eb7c \u0111\u1ecbnh th\u01b0\u1eddng l\u00e0 30 gi\u00e2y) [cite: x]. \u0110\u1ec3 gi\u1ea3i quy\u1ebft b\u00e0i to\u00e1n n\u00e0y trong c\u00e1c t\u00e1c v\u1ee5 n\u1eb7ng, c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean th\u01b0\u1eddng vi\u1ec7n \u0111\u1ebfn c\u00e2u l\u1ec7nh: settimelimit(0); [cite: x] ...","contents":"Khi ph\u00e1t tri\u1ec3n c\u00e1c \u1ee9ng d\u1ee5ng web b\u1eb1ng PHP, ch\u1eafc ch\u1eafn c\u00f3 l\u00fac b\u1ea1n ch\u1ea1m ph\u1ea3i l\u1ed7i th\u1ea3m h\u1ecda:\n`Fatal error: Maximum execution time of 30 seconds exceeded` [cite: x]\n\nL\u1ed7i n\u00e0y xu\u1ea5t hi\u1ec7n khi m\u1ed9t t\u1eadp tin PHP ch\u1ea1y qu\u00e1 th\u1eddi gian cho ph\u00e9p c\u1ee7a m\u00e1y ch\u1ee7 (m\u1eb7c \u0111\u1ecbnh th\u01b0\u1eddng l\u00e0 30 gi\u00e2y) [cite: x]. \u0110\u1ec3 gi\u1ea3i quy\u1ebft b\u00e0i to\u00e1n n\u00e0y trong c\u00e1c t\u00e1c v\u1ee5 n\u1eb7ng, c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean th\u01b0\u1eddng vi\u1ec7n \u0111\u1ebfn c\u00e2u l\u1ec7nh: `set_time_limit(0);` [cite: x]\n\nV\u1eady c\u1ee5 th\u1ec3 `set_time_limit(0);` l\u00e0 g\u00ec, ho\u1ea1t \u0111\u1ed9ng ra sao v\u00e0 c\u1ea7n l\u01b0u \u00fd nh\u1eefng g\u00ec khi s\u1eed d\u1ee5ng? H\u00e3y c\u00f9ng t\u00ecm hi\u1ec3u chi ti\u1ebft trong b\u00e0i vi\u1ebft d\u01b0\u1edbi \u0111\u00e2y [cite: x].\n\n---\n\n## 1. H\u00e0m set_time_limit() l\u00e0 g\u00ec?\n\n`set_time_limit(int $seconds)` l\u00e0 m\u1ed9t h\u00e0m d\u1ef1ng s\u1eb5n (built-in function) c\u1ee7a PHP, cho ph\u00e9p b\u1ea1n thi\u1ebft l\u1eadp th\u1eddi gian th\u1ef1c thi t\u1ed1i \u0111a (t\u00ednh b\u1eb1ng gi\u00e2y) cho m\u1ed9t script PHP [cite: x].\n\n*   N\u1ebfu script ch\u1ea1y v\u01b0\u1ee3t qu\u00e1 s\u1ed1 gi\u00e2y \u0111\u01b0\u1ee3c c\u1ea5u h\u00ecnh trong h\u00e0m n\u00e0y, PHP s\u1ebd l\u1eadp t\u1ee9c ng\u1eaft ch\u01b0\u01a1ng tr\u00ecnh v\u00e0 n\u00e9m ra m\u1ed9t l\u1ed7i ch\u1ebft ng\u01b0\u1eddi (Fatal Error) [cite: x].\n*   Khi \u0111\u01b0\u1ee3c g\u1ecdi, `set_time_limit()` s\u1ebd reset l\u1ea1i b\u1ed9 \u0111\u1ebfm th\u1eddi gian th\u1ef1c thi v\u1ec1 0 [cite: x]. Ngh\u0129a l\u00e0 n\u1ebfu script \u0111\u00e3 ch\u1ea1y \u0111\u01b0\u1ee3c 20 gi\u00e2y v\u00e0 b\u1ea1n g\u1ecdi `set_time_limit(30)`, script \u0111\u00f3 s\u1ebd \u0111\u01b0\u1ee3c ph\u00e9p ch\u1ea1y th\u00eam 30 gi\u00e2y n\u1eefa k\u1ec3 t\u1eeb th\u1eddi \u0111i\u1ec3m h\u00e0m \u0111\u00f3 \u0111\u01b0\u1ee3c g\u1ecdi [cite: x].\n\n---\n\n## 2. S\u1ed1 0 trong set_time_limit(0) c\u00f3 \u00fd ngh\u0129a g\u00ec?\n\nTrong PHP, khi b\u1ea1n truy\u1ec1n tham s\u1ed1 `0` v\u00e0o h\u00e0m `set_time_limit()`, n\u00f3 mang m\u1ed9t \u00fd ngh\u0129a \u0111\u1eb7c bi\u1ec7t:\n\n`set_time_limit(0);` c\u00f3 ngh\u0129a l\u00e0 **B\u1ece GI\u1edaI H\u1ea0N TH\u1edcI GIAN** th\u1ef1c thi [cite: x]. Script PHP s\u1ebd \u0111\u01b0\u1ee3c ph\u00e9p ch\u1ea1y v\u00f4 th\u1eddi h\u1ea1n (Unlimited execution time) cho \u0111\u1ebfn khi ho\u00e0n th\u00e0nh c\u00f4ng vi\u1ec7c ho\u1eb7c khi server b\u1ecb t\u1eaft [cite: x].\n\n### V\u00ed d\u1ee5 minh h\u1ecda:\n```php\n<?php\n\/\/ B\u1ecf gi\u1edbi h\u1ea1n th\u1eddi gian th\u1ef1c thi cho script n\u00e0y\nset_time_limit(0);\n\n\/\/ Gi\u1ea3 l\u1eadp m\u1ed9t t\u00e1c v\u1ee5 t\u1ed1n r\u1ea5t nhi\u1ec1u th\u1eddi gian (ch\u1ea1y trong 5 ph\u00fat)\nfor ($i = 1; $i <= 300; $i++) {\n    \/\/ X\u1eed l\u00fd d\u1eef li\u1ec7u n\u1eb7ng...\n    sleep(1);\n}\n\necho \"X\u1eed l\u00fd th\u00e0nh c\u00f4ng to\u00e0n b\u1ed9 t\u00e1c v\u1ee5!\";\n```\nN\u1ebfu kh\u00f4ng c\u00f3 d\u00f2ng `set_time_limit(0);` \u1edf \u0111\u1ea7u file, \u0111o\u1ea1n code tr\u00ean s\u1ebd s\u1eadp ngay \u1edf gi\u00e2y th\u1ee9 30 [cite: x].\n\n---\n\n## 3. Khi n\u00e0o n\u00ean d\u00f9ng set_time_limit(0)?\n\nTr\u00ecnh duy\u1ec7t web th\u00f4ng th\u01b0\u1eddng lu\u00f4n k\u1ef3 v\u1ecdng nh\u1eadn \u0111\u01b0\u1ee3c ph\u1ea3n h\u1ed3i nhanh (trong v\u00e0i gi\u00e2y) [cite: x]. Tuy nhi\u00ean, `set_time_limit(0)` r\u1ea5t h\u1eefu \u00edch trong c\u00e1c tr\u01b0\u1eddng h\u1ee3p x\u1eed l\u00fd ng\u1ea7m ho\u1eb7c t\u00e1c v\u1ee5 n\u1eb7ng [cite: x]:\n\n*   **Ch\u1ea1y c\u00e1c Cron Job \/ Console Command:** C\u00e1c script ch\u1ea1y ng\u1ea7m b\u1eb1ng CLI (Command Line Interface) \u0111\u1ec3 t\u00ednh to\u00e1n b\u00e1o c\u00e1o cu\u1ed1i th\u00e1ng, d\u1ecdn d\u1eb9p d\u1eef li\u1ec7u r\u00e1c [cite: x].\n*   **Nh\u1eadp \/ Xu\u1ea5t d\u1eef li\u1ec7u l\u1edbn (Import\/Export Data):** \u0110\u1ecdc file Excel\/CSV h\u00e0ng tr\u0103m ngh\u00ecn d\u00f2ng \u0111\u1ec3 l\u01b0u v\u00e0o Database ho\u1eb7c xu\u1ea5t d\u1eef li\u1ec7u b\u00e1o c\u00e1o kh\u1ed5ng l\u1ed3 [cite: x].\n*   **X\u1eed l\u00fd \u0111a ph\u01b0\u01a1ng ti\u1ec7n:** Convert video, n\u00e9n h\u00e0ng ngh\u00ecn t\u1ec7p \u1ea3nh, t\u1ea1o file ZIP dung l\u01b0\u1ee3ng l\u1edbn [cite: x].\n*   **\u0110\u1ed3ng b\u1ed9 d\u1eef li\u1ec7u (Data Sync \/ Migration):** K\u00e9o d\u1eef li\u1ec7u t\u1eeb c\u00e1c API b\u00ean th\u1ee9 ba v\u1edbi kh\u1ed1i l\u01b0\u1ee3ng c\u1ef1c l\u1edbn [cite: x].\n\n---\n\n## 4. R\u1ee7i ro c\u1ef1c l\u1edbn khi l\u1ea1m d\u1ee5ng set_time_limit(0)\n\nD\u00f9 r\u1ea5t ti\u1ec7n l\u1ee3i, `set_time_limit(0)` \u0111\u01b0\u1ee3c coi l\u00e0 \"con dao hai l\u01b0\u1ee1i\" \u0111\u1ed1i v\u1edbi h\u1ea1 t\u1ea7ng m\u00e1y ch\u1ee7 n\u1ebfu b\u1ecb l\u1ea1m d\u1ee5ng ho\u1eb7c d\u00f9ng sai c\u00e1ch [cite: x]:\n\n*   **Treo Server \/ C\u1ea1n k\u1ec7t t\u00e0i nguy\u00ean (Resource Exhaustion):** N\u1ebfu script c\u1ee7a b\u1ea1n b\u1ecb r\u01a1i v\u00e0o v\u00f2ng l\u1eb7p v\u00f4 t\u1eadn (infinite loop) ho\u1eb7c b\u1ecb ngh\u1ebdn (deadlock), v\u00ec kh\u00f4ng c\u00f3 gi\u1edbi h\u1ea1n th\u1eddi gian, PHP process \u0111\u00f3 s\u1ebd ch\u1ea1y m\u00e3i m\u00e3i, ng\u1ea5u nghi\u1ebfn RAM & CPU cho \u0111\u1ebfn khi m\u00e1y ch\u1ee7 s\u1eadp ho\u00e0n to\u00e0n [cite: x].\n*   **T\u1ea1o ra c\u00e1c \"Process Ma\" (Zombie Processes):** Khi ng\u01b0\u1eddi d\u00f9ng t\u1eaft tr\u00ecnh duy\u1ec7t gi\u1eefa ch\u1eebng, n\u1ebfu b\u1ea1n kh\u00f4ng c\u1ea5u h\u00ecnh ch\u1eb7n ng\u1eaft k\u1ebft n\u1ed1i, script v\u1eabn s\u1ebd ti\u1ebfp t\u1ee5c \u00e2m th\u1ea7m ch\u1ea1y tr\u00ean server m\u00e0 kh\u00f4ng c\u00f3 ai nh\u1eadn k\u1ebft qu\u1ea3, g\u00e2y l\u00e3ng ph\u00ed t\u00e0i nguy\u00ean [cite: x].\n*   **Kh\u00f4ng c\u00f3 t\u00e1c d\u1ee5ng v\u1edbi time-out c\u1ee7a Web Server (Nginx \/ Apache):** Ngay c\u1ea3 khi b\u1ea1n \u0111\u1eb7t `set_time_limit(0)`, n\u1ebfu Web Server (nh\u01b0 Nginx) c\u1ea5u h\u00ecnh `fastcgi_read_timeout 60s`, th\u00ec sau 60 gi\u00e2y Nginx v\u1eabn s\u1ebd ng\u1eaft k\u1ebft n\u1ed1i v\u00e0 tr\u1ea3 v\u1ec1 l\u1ed7i `504 Gateway Timeout` cho ng\u01b0\u1eddi d\u00f9ng [cite: x].\n\n---\n\n## 5. C\u00e1c gi\u1ea3i ph\u00e1p thay th\u1ebf chu\u1ea9n m\u1ef1c (Best Practices)\n\nTrong t\u01b0 duy ki\u1ebfn tr\u00fac ph\u1ea7n m\u1ec1m hi\u1ec7n \u0111\u1ea1i, vi\u1ec7c b\u1eaft ng\u01b0\u1eddi d\u00f9ng ch\u1edd m\u1ed9t HTTP Request ch\u1ea1y qu\u00e1 30 gi\u00e2y l\u00e0 m\u1ed9t tr\u1ea3i nghi\u1ec7m r\u1ea5t t\u1ed3i [cite: x]. Thay v\u00ec l\u1ea1m d\u1ee5ng `set_time_limit(0)` tr\u1ef1c ti\u1ebfp tr\u00ean Web Request, b\u1ea1n n\u00ean c\u00e2n nh\u1eafc c\u00e1c gi\u1ea3i ph\u00e1p sau:\n\n1.  **S\u1eed d\u1ee5ng Queue & Background Jobs (Khuy\u00ean d\u00f9ng):**\n    \u0110\u01b0a c\u00e1c t\u00e1c v\u1ee5 n\u1eb7ng v\u00e0o h\u00e0ng ch\u1edd (Queue) nh\u01b0 Redis, RabbitMQ [cite: x]. Tr\u1ea3 v\u1ec1 ph\u1ea3n h\u1ed3i cho ng\u01b0\u1eddi d\u00f9ng ngay l\u1eadp t\u1ee9c (\"H\u1ec7 th\u1ed1ng \u0111ang x\u1eed l\u00fd...\") v\u00e0 \u0111\u1ec3 c\u00e1c Worker process (ch\u1ea1y b\u1eb1ng CLI - v\u1ed1n m\u1eb7c \u0111\u1ecbnh kh\u00f4ng b\u1ecb gi\u1edbi h\u1ea1n time limit) x\u1eed l\u00fd ng\u1ea7m b\u00ean d\u01b0\u1edbi [cite: x].\n2.  **Chia nh\u1ecf t\u00e1c v\u1ee5 (Chunking):**\n    Thay v\u00ec x\u1eed l\u00fd 100.000 b\u1ea3n ghi c\u00f9ng l\u00fac, h\u00e3y chia nh\u1ecf th\u00e0nh t\u1eebng batch 1.000 b\u1ea3n ghi v\u00e0 d\u00f9ng Ajax \u0111\u1ec3 g\u1ecdi n\u1ed1i ti\u1ebfp nhau [cite: x].\n3.  **\u0110\u1eb7t th\u1eddi gian gi\u1edbi h\u1ea1n h\u1ee3p l\u00fd thay v\u00ec cho b\u1eb1ng 0:**\n    N\u1ebfu bi\u1ebft t\u00e1c v\u1ee5 c\u1ea7n kho\u1ea3ng 3 ph\u00fat, h\u00e3y \u0111\u1eb7t `set_time_limit(300)` (5 ph\u00fat) thay v\u00ec \u0111\u1eb7t 0 \u0111\u1ec3 v\u1eabn gi\u1eef l\u1ea1i m\u1ed9t \"m\u00e0ng b\u1ea3o v\u1ec7\" ph\u00f2ng tr\u01b0\u1eddng h\u1ee3p code b\u1ecb l\u1eb7p v\u00f4 t\u1eadn [cite: x].\n\n---\n\n## T\u1ed5ng k\u1ebft\n\n*   `set_time_limit(0);` gi\u00fap script PHP ch\u1ea1y kh\u00f4ng gi\u1edbi h\u1ea1n th\u1eddi gian, gi\u1ea3i quy\u1ebft tri\u1ec7t \u0111\u1ec3 l\u1ed7i `Maximum execution time exceeded` [cite: x].\n*   Ch\u1ec9 n\u00ean d\u00f9ng n\u00f3 cho c\u00e1c t\u00e1c v\u1ee5 Cron job, CLI, ho\u1eb7c c\u00e1c trang Admin th\u1ef1c hi\u1ec7n import\/export d\u1eef li\u1ec7u \u0111\u1eb7c th\u00f9 [cite: x].\n*   C\u1ea7n c\u1ea9n tr\u1ecdng r\u1ee7i ro l\u00e0m treo m\u00e1y ch\u1ee7 v\u00e0 n\u00ean \u01b0u ti\u00ean chuy\u1ec3n sang m\u00f4 h\u00ecnh Queue \/ Background Job \u0111\u1ed1i v\u1edbi c\u00e1c h\u1ec7 th\u1ed1ng l\u1edbn [cite: x].","published_at":"2026-08-05T07:02:37.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T16:09:03.000000Z","edited_at":"2026-08-05T07:02:32.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":6,"points":0,"views_count":10,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/579acbaf-1de3-4a4d-be99-770b413d7a00.png","user":{"data":{"id":182653,"url":"https:\/\/viblo.asia\/u\/hhoang","avatar":"15b74a7e-16dd-435c-b375-62f02864e065.jpg","name":"Nguy\u1ec5n Huy Ho\u00e0ng","username":"hhoang","followers_count":144,"reputation":11227,"posts_count":987,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"doc-file-trong-php","name":"\u0111\u1ecdc file trong php"}]},"commentators":{"data":[]}},{"id":104777,"title":"PocketBase Cloud l\u00e0 g\u00ec? H\u01b0\u1edbng d\u1eabn t\u1ea1o PocketBase instance \u0111\u1ea7u ti\u00ean","slug":"k74a9pk64eO","url":"https:\/\/viblo.asia\/p\/pocketbase-cloud-la-gi-huong-dan-tao-pocketbase-instance-dau-tien-k74a9pk64eO","user_id":201786,"moderation":null,"transliterated":"pocketbase-cloud-la-gi-huong-dan-tao-pocketbase-instance-dau-tien","contents_short":"N\u1ebfu b\u1ea1n ch\u01b0a t\u1eebng s\u1eed d\u1ee5ng PocketBase, \u0111\u00e2y l\u00e0 m\u1ed9t backend m\u00e3 ngu\u1ed3n m\u1edf \u0111\u01b0\u1ee3c \u0111\u00f3ng g\u00f3i trong m\u1ed9t file Go binary duy nh\u1ea5t.\n\nPocketBase t\u00edch h\u1ee3p s\u1eb5n nhi\u1ec1u th\u00e0nh ph\u1ea7n c\u1ea7n thi\u1ebft \u0111\u1ec3 x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng:\n\n* C\u01a1 s\u1edf d\u1eef li\u1ec7u SQLite\n* X\u00e1c th\u1ef1c ng\u01b0\u1eddi d\u00f9ng\n* Realtime subscription\n* L\u01b0u tr\u1eef file\n* REST API\n* Giao di\u1ec7n qu\u1ea3n tr\u1ecb\n* JavaScript Hooks\n\nNh\u1edd \u0111\u00f3, b\u1ea1n c\u00f3 th\u1ec3 nhanh ch\u00f3ng x\u00e2y d\u1ef1ng backend cho website, SaaS, \u1ee9...","contents":"N\u1ebfu b\u1ea1n ch\u01b0a t\u1eebng s\u1eed d\u1ee5ng [PocketBase](https:\/\/pocketbase.io), \u0111\u00e2y l\u00e0 m\u1ed9t backend m\u00e3 ngu\u1ed3n m\u1edf \u0111\u01b0\u1ee3c \u0111\u00f3ng g\u00f3i trong m\u1ed9t file Go binary duy nh\u1ea5t.\n\nPocketBase t\u00edch h\u1ee3p s\u1eb5n nhi\u1ec1u th\u00e0nh ph\u1ea7n c\u1ea7n thi\u1ebft \u0111\u1ec3 x\u00e2y d\u1ef1ng \u1ee9ng d\u1ee5ng:\n\n* C\u01a1 s\u1edf d\u1eef li\u1ec7u SQLite\n* X\u00e1c th\u1ef1c ng\u01b0\u1eddi d\u00f9ng\n* Realtime subscription\n* L\u01b0u tr\u1eef file\n* REST API\n* Giao di\u1ec7n qu\u1ea3n tr\u1ecb\n* JavaScript Hooks\n\nNh\u1edd \u0111\u00f3, b\u1ea1n c\u00f3 th\u1ec3 nhanh ch\u00f3ng x\u00e2y d\u1ef1ng backend cho website, SaaS, \u1ee9ng d\u1ee5ng mobile ho\u1eb7c side project m\u00e0 kh\u00f4ng c\u1ea7n k\u1ebft h\u1ee3p qu\u00e1 nhi\u1ec1u d\u1ecbch v\u1ee5 kh\u00e1c nhau.\n\nTuy nhi\u00ean, khi \u0111\u01b0a PocketBase l\u00ean m\u00f4i tr\u01b0\u1eddng production, b\u1ea1n v\u1eabn ph\u1ea3i t\u1ef1 x\u1eed l\u00fd kh\u00e1 nhi\u1ec1u c\u00f4ng vi\u1ec7c nh\u01b0 thu\u00ea VPS, c\u1ea5u h\u00ecnh reverse proxy, c\u1ea5p ch\u1ee9ng ch\u1ec9 SSL, b\u1ea3o v\u1ec7 m\u00e1y ch\u1ee7, backup d\u1eef li\u1ec7u v\u00e0 theo d\u00f5i tr\u1ea1ng th\u00e1i h\u1ec7 th\u1ed1ng.\n\n\u0110\u00f3 l\u00e0 v\u1ea5n \u0111\u1ec1 m\u00e0 [**PocketBase Cloud**](https:\/\/pocketbasecloud.com) mu\u1ed1n gi\u1ea3i quy\u1ebft.\n\nPocketBase Cloud l\u00e0 n\u1ec1n t\u1ea3ng managed hosting \u0111\u01b0\u1ee3c x\u00e2y d\u1ef1ng ri\u00eang cho PocketBase. Thay v\u00ec t\u1ef1 v\u1eadn h\u00e0nh m\u00e1y ch\u1ee7, b\u1ea1n c\u00f3 th\u1ec3 t\u1ea1o m\u1ed9t PocketBase instance tr\u1ef1c ti\u1ebfp t\u1eeb dashboard v\u00e0 b\u1eaft \u0111\u1ea7u s\u1eed d\u1ee5ng g\u1ea7n nh\u01b0 ngay l\u1eadp t\u1ee9c.\n\nTrong b\u00e0i vi\u1ebft n\u00e0y, t\u00f4i s\u1ebd h\u01b0\u1edbng d\u1eabn to\u00e0n b\u1ed9 qu\u00e1 tr\u00ecnh t\u1ea1o PocketBase instance \u0111\u1ea7u ti\u00ean tr\u00ean PocketBase Cloud.\n![](https:\/\/images.viblo.asia\/565e006d-622c-4fef-a40e-8394a23f7eab.png)\n\n\n## V\u00ec sao t\u00f4i ch\u1ecdn PocketBase Cloud?\n\nT\u00f4i \u0111\u00e3 xem qua m\u1ed9t s\u1ed1 l\u1ef1a ch\u1ecdn hosting PocketBase v\u00e0 quy\u1ebft \u0111\u1ecbnh th\u1eed PocketBase Cloud v\u00ec nh\u1eefng l\u00fd do sau.\n[{@embed: https:\/\/www.youtube.com\/watch?v=QNcMGfldgj8}](pocketbasecloud)\n\n### 1. C\u00f3 g\u00f3i mi\u1ec5n ph\u00ed \u0111\u1ec3 b\u1eaft \u0111\u1ea7u\n\nG\u00f3i Free hi\u1ec7n c\u00f3 gi\u00e1 `$0\/th\u00e1ng` v\u00e0 bao g\u1ed3m:\n\n* 1 PocketBase instance\n* 50 MB dung l\u01b0\u1ee3ng l\u01b0u tr\u1eef\n* Frontend hosting\n* Shared server\n* Qu\u1ea3n l\u00fd Organization v\u00e0 Team\n* Ch\u1ee9ng ch\u1ec9 SSL\n* Community support\n* B\u0103ng th\u00f4ng b\u1eaft \u0111\u1ea7u t\u1eeb 50 GB\n\nPocketBase Cloud y\u00eau c\u1ea7u t\u1ea1o m\u1ed9t Stripe subscription mi\u1ec5n ph\u00ed \u0111\u1ec3 x\u00e1c minh th\u00f4ng tin thanh to\u00e1n v\u00e0 h\u1ea1n ch\u1ebf bot ho\u1eb7c h\u00e0nh vi l\u1ea1m d\u1ee5ng.\n\nB\u1ea1n s\u1ebd kh\u00f4ng b\u1ecb t\u00ednh ph\u00ed khi s\u1eed d\u1ee5ng g\u00f3i Free.\n\nM\u1ed9t l\u01b0u \u00fd quan tr\u1ecdng l\u00e0 t\u00e0i nguy\u00ean Free c\u00f3 th\u1ec3 b\u1ecb t\u1ef1 \u0111\u1ed9ng x\u00f3a n\u1ebfu kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng trong 30 ng\u00e0y. V\u00ec v\u1eady, g\u00f3i n\u00e0y ph\u00f9 h\u1ee3p nh\u1ea5t \u0111\u1ec3 th\u1eed nghi\u1ec7m, h\u1ecdc t\u1eadp, x\u00e2y d\u1ef1ng prototype ho\u1eb7c ch\u1ea1y c\u00e1c project nh\u1ecf v\u1eabn \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng th\u01b0\u1eddng xuy\u00ean.\n\n### 2. C\u00f3 nhi\u1ec1u khu v\u1ef1c tri\u1ec3n khai\n\nS\u1ed1 l\u01b0\u1ee3ng khu v\u1ef1c b\u1ea1n c\u00f3 th\u1ec3 l\u1ef1a ch\u1ecdn ph\u1ee5 thu\u1ed9c v\u00e0o g\u00f3i:\n\n* Free: 1 khu v\u1ef1c\n* Starter: 6 khu v\u1ef1c\n* Pro: 10 khu v\u1ef1c\n\nG\u00f3i Pro hi\u1ec7n h\u1ed7 tr\u1ee3 c\u00e1c location t\u1ea1i ch\u00e2u \u00c2u, B\u1eafc M\u1ef9 v\u00e0 khu v\u1ef1c ch\u00e2u \u00c1 \u2013 Th\u00e1i B\u00ecnh D\u01b0\u01a1ng, bao g\u1ed3m Singapore v\u00e0 Sydney.\n\nN\u1ebfu ng\u01b0\u1eddi d\u00f9ng c\u1ee7a b\u1ea1n ch\u1ee7 y\u1ebfu \u1edf Vi\u1ec7t Nam ho\u1eb7c \u0110\u00f4ng Nam \u00c1, Singapore th\u01b0\u1eddng l\u00e0 l\u1ef1a ch\u1ecdn h\u1ee3p l\u00fd \u0111\u1ec3 gi\u1ea3m \u0111\u1ed9 tr\u1ec5.\n\n### 3. Kh\u00f4ng c\u1ea7n t\u1ef1 c\u1ea5u h\u00ecnh SSL\n\nM\u1ed7i PocketBase instance \u0111\u1ec1u \u0111\u01b0\u1ee3c c\u1ea5p m\u1ed9t subdomain m\u1eb7c \u0111\u1ecbnh d\u01b0\u1edbi t\u00ean mi\u1ec1n:\n\n```plaintext\n<instance-name>.pocketbasecloud.com\n```\n\nCh\u1ee9ng ch\u1ec9 SSL \u0111\u01b0\u1ee3c c\u1ea5u h\u00ecnh s\u1eb5n, v\u00ec v\u1eady instance c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c truy c\u1eadp tr\u1ef1c ti\u1ebfp qua HTTPS m\u00e0 kh\u00f4ng c\u1ea7n t\u1ef1 thi\u1ebft l\u1eadp Caddy, Nginx ho\u1eb7c Certbot.\n\nDDoS protection v\u00e0 custom domain hi\u1ec7n c\u00f3 tr\u00ean g\u00f3i Starter v\u00e0 Pro.\n\n### 4. Chi ph\u00ed t\u01b0\u01a1ng \u0111\u1ed1i d\u1ec5 d\u1ef1 \u0111o\u00e1n\n\nPocketBase Cloud s\u1eed d\u1ee5ng m\u00f4 h\u00ecnh gi\u00e1 c\u1ed1 \u0111\u1ecbnh theo th\u00e1ng thay v\u00ec t\u00ednh ti\u1ec1n theo t\u1eebng request, t\u1eebng ng\u01b0\u1eddi d\u00f9ng ho\u1eb7c t\u1eebng gigabyte d\u1eef li\u1ec7u \u0111\u01b0\u1ee3c truy\u1ec1n.\n\nT\u1ea1i th\u1eddi \u0111i\u1ec3m b\u00e0i vi\u1ebft n\u00e0y \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt, PocketBase Cloud c\u00f3 ba g\u00f3i ch\u00ednh.\n\n#### Free \u2014 $0\/th\u00e1ng\n\nPh\u00f9 h\u1ee3p \u0111\u1ec3 th\u1eed nghi\u1ec7m ho\u1eb7c x\u00e2y d\u1ef1ng project nh\u1ecf:\n\n* 1 PocketBase instance\n* 50 MB storage\n* Shared server\n* Frontend hosting\n* SSL\n* 1 khu v\u1ef1c\n* T\u1ef1 \u0111\u1ed9ng x\u00f3a sau 30 ng\u00e0y kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng\n\n#### Starter \u2014 $5\/th\u00e1ng trong th\u1eddi gian \u01b0u \u0111\u00e3i\n\nGi\u00e1 th\u00f4ng th\u01b0\u1eddng \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb l\u00e0 `$10\/th\u00e1ng`, hi\u1ec7n \u0111ang gi\u1ea3m c\u00f2n `$5\/th\u00e1ng`.\n\nG\u00f3i Starter bao g\u1ed3m:\n\n* 1 PocketBase instance\n* 3 GB storage\n* Frontend hosting\n* Separate server cluster\n* 6 khu v\u1ef1c tri\u1ec3n khai\n* Custom domain\n* SSL v\u00e0 DDoS protection\n* Organization v\u00e0 Team management\n* H\u1ed7 tr\u1ee3 qua email v\u00e0 Discord\n* B\u0103ng th\u00f4ng b\u1eaft \u0111\u1ea7u t\u1eeb 100 GB\n\nStarter c\u0169ng cho ph\u00e9p mua th\u00eam deployment slot:\n\n* Th\u00eam 1 PocketBase instance: hi\u1ec7n `$5\/th\u00e1ng`\n* Th\u00eam 5 frontend deployment: hi\u1ec7n `$5\/th\u00e1ng`\n\n#### Pro \u2014 $20\/th\u00e1ng trong th\u1eddi gian \u01b0u \u0111\u00e3i\n\nGi\u00e1 th\u00f4ng th\u01b0\u1eddng \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb l\u00e0 `$30\/th\u00e1ng`, hi\u1ec7n \u0111ang gi\u1ea3m c\u00f2n `$20\/th\u00e1ng`.\n\nG\u00f3i Pro cung c\u1ea5p m\u1ed9t dedicated compute ri\u00eang v\u1edbi:\n\n* Dedicated compute 2 vCPU\n* L\u1ef1a ch\u1ecdn 1 trong 10 khu v\u1ef1c\n* Kh\u00f4ng gi\u1edbi h\u1ea1n PocketBase instance theo m\u00f4 h\u00ecnh s\u1eed d\u1ee5ng h\u1ee3p l\u00fd\n* Kh\u00f4ng gi\u1edbi h\u1ea1n frontend deployment\n* Backend hosting cho Node.js, Next.js, Deno v\u00e0 Bun\n* Custom domain\n* SSL v\u00e0 DDoS protection\n* Live monitoring dashboard\n* Priority support\n* B\u0103ng th\u00f4ng b\u1eaft \u0111\u1ea7u t\u1eeb 1 TB\n\nB\u1ea1n \u0111ang tr\u1ea3 ti\u1ec1n cho compute ri\u00eang thay v\u00ec tr\u1ea3 ph\u00ed tr\u00ean t\u1eebng deployment. V\u00ec v\u1eady, g\u00f3i n\u00e0y c\u00f3 th\u1ec3 ph\u00f9 h\u1ee3p n\u1ebfu b\u1ea1n v\u1eadn h\u00e0nh nhi\u1ec1u PocketBase instance, frontend v\u00e0 backend tr\u00ean c\u00f9ng m\u1ed9t h\u1ea1 t\u1ea7ng.\n\nTuy nhi\u00ean, dedicated compute c\u1ee7a g\u00f3i Pro kh\u00f4ng \u0111\u01b0\u1ee3c t\u1ea1o ngay l\u1eadp t\u1ee9c. Theo trang Pricing, qu\u00e1 tr\u00ecnh chu\u1ea9n b\u1ecb c\u00f3 th\u1ec3 m\u1ea5t t\u1ed1i \u0111a 48 gi\u1edd sau khi checkout.\n\n## B\u01b0\u1edbc 1: \u0110\u0103ng k\u00fd t\u00e0i kho\u1ea3n\n\nTruy c\u1eadp:\n\nhttps:\/\/portal.pocketbasecloud.com\n\nT\u1ea1o t\u00e0i kho\u1ea3n v\u00e0 ho\u00e0n t\u1ea5t b\u01b0\u1edbc x\u00e1c minh Stripe.\n\n\u0110\u1ed1i v\u1edbi g\u00f3i Free, Stripe subscription c\u00f3 gi\u00e1 `$0` v\u00e0 kh\u00f4ng ph\u00e1t sinh ph\u00ed.\n\nSau khi \u0111\u0103ng nh\u1eadp, t\u1ea1o m\u1ed9t **Project** m\u1edbi.\n\nProject \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 nh\u00f3m c\u00e1c t\u00e0i nguy\u00ean li\u00ean quan nh\u01b0 PocketBase instance, frontend deployment v\u00e0 c\u00e1c th\u00e0nh vi\u00ean trong team.\n\n## B\u01b0\u1edbc 2: T\u1ea1o PocketBase instance\n\nM\u1edf project v\u1eeba t\u1ea1o, chuy\u1ec3n sang tab **PocketBase**, sau \u0111\u00f3 nh\u1ea5n **New PocketBase**.\n\nBi\u1ec3u m\u1eabu t\u1ea1o instance th\u01b0\u1eddng bao g\u1ed3m ba nh\u00f3m th\u00f4ng tin ch\u00ednh.\n\n### General Information\n\n#### Instance Name\n\n\u0110\u1eb7t t\u00ean cho PocketBase instance.\n\nT\u00ean n\u00e0y s\u1ebd \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 t\u1ea1o subdomain m\u1eb7c \u0111\u1ecbnh. V\u00ed d\u1ee5:\n\n```plaintext\nmy-pocketbase\n```\n\nInstance s\u1ebd c\u00f3 \u0111\u1ecba ch\u1ec9 t\u01b0\u01a1ng t\u1ef1:\n\n```plaintext\nhttps:\/\/my-pocketbase.pocketbasecloud.com\n```\n\nB\u1ea1n n\u00ean ch\u1ecdn t\u00ean ng\u1eafn, d\u1ec5 nh\u1edb v\u00e0 ch\u1ec9 s\u1eed d\u1ee5ng c\u00e1c k\u00fd t\u1ef1 h\u1ee3p l\u1ec7 cho t\u00ean mi\u1ec1n.\n\n#### Description\n\nPh\u1ea7n m\u00f4 t\u1ea3 kh\u00f4ng b\u1eaft bu\u1ed9c.\n\nB\u1ea1n c\u00f3 th\u1ec3 d\u00f9ng n\u00f3 \u0111\u1ec3 ghi ch\u00fa m\u1ee5c \u0111\u00edch c\u1ee7a instance, ch\u1eb3ng h\u1ea1n:\n\n```plaintext\nBackend cho \u1ee9ng d\u1ee5ng qu\u1ea3n l\u00fd c\u00f4ng vi\u1ec7c\n```\n\n#### PocketBase Version\n\nCh\u1ecdn phi\u00ean b\u1ea3n PocketBase m\u00e0 project s\u1ebd s\u1eed d\u1ee5ng.\n\nTh\u00f4ng th\u01b0\u1eddng, b\u1ea1n n\u00ean ch\u1ecdn phi\u00ean b\u1ea3n m\u1edbi nh\u1ea5t \u0111\u01b0\u1ee3c n\u1ec1n t\u1ea3ng h\u1ed7 tr\u1ee3, tr\u1eeb khi \u1ee9ng d\u1ee5ng ho\u1eb7c JavaScript Hooks c\u1ee7a b\u1ea1n ph\u1ee5 thu\u1ed9c v\u00e0o m\u1ed9t phi\u00ean b\u1ea3n c\u1ee5 th\u1ec3.\n\nKh\u00f4ng n\u00ean d\u1ef1a v\u00e0o s\u1ed1 phi\u00ean b\u1ea3n trong c\u00e1c b\u00e0i h\u01b0\u1edbng d\u1eabn c\u0169 v\u00ec PocketBase \u0111\u01b0\u1ee3c c\u1eadp nh\u1eadt kh\u00e1 th\u01b0\u1eddng xuy\u00ean.\n\n### Admin Credentials\n\nNh\u1eadp email v\u00e0 m\u1eadt kh\u1ea9u cho t\u00e0i kho\u1ea3n qu\u1ea3n tr\u1ecb PocketBase.\n\n\u0110\u00e2y l\u00e0 t\u00e0i kho\u1ea3n d\u00f9ng \u0111\u1ec3 \u0111\u0103ng nh\u1eadp v\u00e0o PocketBase Admin Dashboard t\u1ea1i \u0111\u01b0\u1eddng d\u1eabn `\/_\/`.\n\nB\u1ea1n n\u00ean:\n\n* S\u1eed d\u1ee5ng m\u1eadt kh\u1ea9u m\u1ea1nh\n* Kh\u00f4ng d\u00f9ng l\u1ea1i m\u1eadt kh\u1ea9u c\u1ee7a t\u00e0i kho\u1ea3n kh\u00e1c\n* L\u01b0u m\u1eadt kh\u1ea9u v\u00e0o password manager\n* Sao ch\u00e9p m\u1eadt kh\u1ea9u tr\u01b0\u1edbc khi nh\u1ea5n Create\n\nKh\u00f4ng n\u00ean s\u1eed d\u1ee5ng t\u00e0i kho\u1ea3n qu\u1ea3n tr\u1ecb n\u00e0y tr\u1ef1c ti\u1ebfp trong frontend ho\u1eb7c \u0111\u01b0a th\u00f4ng tin \u0111\u0103ng nh\u1eadp v\u00e0o source code.\n\n### Location\n\nN\u1ebfu g\u00f3i hi\u1ec7n t\u1ea1i h\u1ed7 tr\u1ee3 l\u1ef1a ch\u1ecdn region, h\u00e3y ch\u1ecdn khu v\u1ef1c g\u1ea7n ph\u1ea7n l\u1edbn ng\u01b0\u1eddi d\u00f9ng c\u1ee7a b\u1ea1n nh\u1ea5t.\n\nV\u00ed d\u1ee5, n\u1ebfu ng\u01b0\u1eddi d\u00f9ng ch\u1ee7 y\u1ebfu \u1edf Vi\u1ec7t Nam ho\u1eb7c \u0110\u00f4ng Nam \u00c1, b\u1ea1n c\u00f3 th\u1ec3 ch\u1ecdn Singapore.\n\nKho\u1ea3ng c\u00e1ch \u0111\u1ecba l\u00fd ng\u1eafn h\u01a1n th\u01b0\u1eddng gi\u00fap gi\u1ea3m network latency gi\u1eefa frontend v\u00e0 PocketBase API.\n\nSau khi ho\u00e0n t\u1ea5t, nh\u1ea5n **Create**.\n\n## B\u01b0\u1edbc 3: Ch\u1edd h\u1ec7 th\u1ed1ng kh\u1edfi t\u1ea1o instance\n\nSau khi t\u1ea1o, PocketBase Cloud s\u1ebd b\u1eaft \u0111\u1ea7u tri\u1ec3n khai instance.\n\nTrong qu\u00e1 tr\u00ecnh n\u00e0y, h\u1ec7 th\u1ed1ng c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n c\u00e1c c\u00f4ng vi\u1ec7c nh\u01b0:\n\n* Ch\u1ecdn m\u00e1y ch\u1ee7 ph\u00f9 h\u1ee3p\n* Kh\u1edfi ch\u1ea1y PocketBase process\n* T\u1ea1o th\u01b0 m\u1ee5c d\u1eef li\u1ec7u ri\u00eang\n* G\u00e1n \u0111\u1ecba ch\u1ec9 truy c\u1eadp cho instance\n* C\u1ea5u h\u00ecnh DNS\n* C\u1ea5p ch\u1ee9ng ch\u1ec9 HTTPS\n* K\u1ebft n\u1ed1i instance v\u1edbi h\u1ec7 th\u1ed1ng qu\u1ea3n l\u00fd\n\n\u0110\u1ed1i v\u1edbi PocketBase instance th\u00f4ng th\u01b0\u1eddng, qu\u00e1 tr\u00ecnh tri\u1ec3n khai th\u01b0\u1eddng di\u1ec5n ra kh\u00e1 nhanh.\n\nSau khi ho\u00e0n t\u1ea5t, backend c\u1ee7a b\u1ea1n s\u1ebd c\u00f3 \u0111\u1ecba ch\u1ec9:\n\n```plaintext\nhttps:\/\/<instance-name>.pocketbasecloud.com\n```\n\nL\u01b0u \u00fd r\u1eb1ng th\u1eddi gian \u201ckho\u1ea3ng 30 gi\u00e2y\u201d \u0111\u01b0\u1ee3c PocketBase Cloud d\u00f9ng \u0111\u1ec3 m\u00f4 t\u1ea3 vi\u1ec7c b\u1eaft \u0111\u1ea7u v\u1edbi n\u1ec1n t\u1ea3ng v\u00e0 t\u1ea1o instance th\u00f4ng th\u01b0\u1eddng.\n\nRi\u00eang dedicated compute c\u1ee7a g\u00f3i Pro c\u00f3 th\u1ec3 m\u1ea5t t\u1ed1i \u0111a 48 gi\u1edd \u0111\u1ec3 \u0111\u01b0\u1ee3c chu\u1ea9n b\u1ecb.\n\n## B\u01b0\u1edbc 4: \u0110\u0103ng nh\u1eadp PocketBase Admin Dashboard\n\nPocketBase Admin Dashboard v\u1eabn s\u1eed d\u1ee5ng \u0111\u01b0\u1eddng d\u1eabn quen thu\u1ed9c:\n\n```plaintext\nhttps:\/\/<instance-name>.pocketbasecloud.com\/_\/\n```\n\n\u0110\u0103ng nh\u1eadp b\u1eb1ng email v\u00e0 m\u1eadt kh\u1ea9u qu\u1ea3n tr\u1ecb \u0111\u00e3 t\u1ea1o tr\u01b0\u1edbc \u0111\u00f3.\n\n\u0110\u00e2y l\u00e0 giao di\u1ec7n PocketBase ti\u00eau chu\u1ea9n, v\u00ec v\u1eady b\u1ea1n v\u1eabn c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng c\u00e1c ch\u1ee9c n\u0103ng quen thu\u1ed9c nh\u01b0:\n\n* T\u1ea1o v\u00e0 ch\u1ec9nh s\u1eeda collection\n* Qu\u1ea3n l\u00fd record\n* Qu\u1ea3n l\u00fd user\n* Thi\u1ebft l\u1eadp API Rules\n* C\u1ea5u h\u00ecnh authentication\n* Qu\u1ea3n l\u00fd file\n* Xem logs\n* Thi\u1ebft l\u1eadp email\n* Qu\u1ea3n l\u00fd backup\n* S\u1eed d\u1ee5ng realtime subscription\n\nPocketBase Cloud ch\u1ee7 y\u1ebfu x\u1eed l\u00fd ph\u1ea7n h\u1ea1 t\u1ea7ng. C\u00e1ch s\u1eed d\u1ee5ng PocketBase b\u00ean trong g\u1ea7n nh\u01b0 kh\u00f4ng thay \u0111\u1ed5i so v\u1edbi khi b\u1ea1n t\u1ef1 host.\n\n## B\u01b0\u1edbc 5: T\u1ea1o collection \u0111\u1ea7u ti\u00ean\n\n\u0110\u1ec3 ki\u1ec3m tra instance, t\u00f4i t\u1ea1o m\u1ed9t collection c\u00f3 t\u00ean:\n\n```plaintext\ntodos\n```\n\nB\u1ea1n c\u00f3 th\u1ec3 th\u00eam m\u1ed9t s\u1ed1 field c\u01a1 b\u1ea3n:\n\n* `title`: ki\u1ec3u Text\n* `completed`: ki\u1ec3u Boolean\n\nSau \u0111\u00f3, th\u00eam m\u1ed9t v\u00e0i record th\u1eed nghi\u1ec7m.\n\nTr\u01b0\u1edbc khi g\u1ecdi collection t\u1eeb frontend, h\u00e3y ki\u1ec3m tra API Rules.\n\nN\u1ebfu List Rule v\u00e0 View Rule \u0111ang \u1edf tr\u1ea1ng th\u00e1i ch\u1ec9 d\u00e0nh cho superuser, request t\u1eeb ng\u01b0\u1eddi d\u00f9ng ch\u01b0a \u0111\u0103ng nh\u1eadp s\u1ebd kh\u00f4ng th\u1ec3 \u0111\u1ecdc d\u1eef li\u1ec7u.\n\n\u0110\u1ed1i v\u1edbi project th\u1eed nghi\u1ec7m, b\u1ea1n c\u00f3 th\u1ec3 m\u1edf quy\u1ec1n \u0111\u1ecdc c\u00f4ng khai. Tuy nhi\u00ean, v\u1edbi \u1ee9ng d\u1ee5ng th\u1eadt, h\u00e3y c\u1ea5u h\u00ecnh API Rules d\u1ef1a tr\u00ean quy\u1ec1n s\u1edf h\u1eefu v\u00e0 tr\u1ea1ng th\u00e1i \u0111\u0103ng nh\u1eadp thay v\u00ec \u0111\u1ec3 to\u00e0n b\u1ed9 d\u1eef li\u1ec7u c\u00f4ng khai.\n\n## B\u01b0\u1edbc 6: K\u1ebft n\u1ed1i b\u1eb1ng PocketBase JavaScript SDK\n\nC\u00e0i PocketBase SDK:\n\n```bash\nnpm install pocketbase\n```\n\nSau \u0111\u00f3 t\u1ea1o client:\n\n```js\nimport PocketBase from 'pocketbase';\n\nconst pb = new PocketBase(\n  'https:\/\/my-pocketbase.pocketbasecloud.com'\n);\n```\n\nL\u1ea5y danh s\u00e1ch record t\u1eeb collection `todos`:\n\n```js\nconst todos = await pb.collection('todos').getFullList({\n  sort: '-created',\n});\n\nconsole.log(todos);\n```\n\n## S\u1eed d\u1ee5ng realtime subscription\n\nPocketBase h\u1ed7 tr\u1ee3 realtime subscription th\u00f4ng qua SDK.\n\nV\u00ed d\u1ee5:\n\n```js\nawait pb.collection('todos').subscribe('*', (event) => {\n  console.log(event.action);\n  console.log(event.record);\n});\n```\n\nCallback s\u1ebd \u0111\u01b0\u1ee3c g\u1ecdi khi record trong collection \u0111\u01b0\u1ee3c t\u1ea1o, c\u1eadp nh\u1eadt ho\u1eb7c x\u00f3a, t\u00f9y theo quy\u1ec1n truy c\u1eadp c\u1ee7a ng\u01b0\u1eddi d\u00f9ng hi\u1ec7n t\u1ea1i.\n\nB\u1ea1n c\u00f3 th\u1ec3 h\u1ee7y subscription b\u1eb1ng:\n\n```js\npb.collection('todos').unsubscribe('*');\n```\n\nKh\u00f4ng n\u00ean qu\u00ean h\u1ee7y subscription khi component b\u1ecb unmount, \u0111\u1eb7c bi\u1ec7t trong React, Vue ho\u1eb7c c\u00e1c \u1ee9ng d\u1ee5ng SPA.\n\nV\u00ed d\u1ee5 v\u1edbi React:\n\n```js\nimport { useEffect } from 'react';\nimport PocketBase from 'pocketbase';\n\nconst pb = new PocketBase(\n  'https:\/\/my-pocketbase.pocketbasecloud.com'\n);\n\nfunction TodoRealtime() {\n  useEffect(() => {\n    pb.collection('todos').subscribe('*', (event) => {\n      console.log(event.action, event.record);\n    });\n\n    return () => {\n      pb.collection('todos').unsubscribe('*');\n    };\n  }, []);\n\n  return null;\n}\n```\n\n## M\u1ed9t s\u1ed1 \u0111i\u1ec1u c\u1ea7n l\u01b0u \u00fd\n\n### G\u00f3i Free c\u00f3 gi\u1edbi h\u1ea1n 50 MB\n\nDung l\u01b0\u1ee3ng n\u00e0y bao g\u1ed3m d\u1eef li\u1ec7u v\u00e0 file \u0111\u01b0\u1ee3c l\u01b0u trong PocketBase instance.\n\nN\u1ebfu \u1ee9ng d\u1ee5ng c\u00f3 upload \u1ea3nh ho\u1eb7c t\u00e0i li\u1ec7u, 50 MB c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng h\u1ebft kh\u00e1 nhanh.\n\nB\u1ea1n n\u00ean:\n\n* Gi\u1edbi h\u1ea1n k\u00edch th\u01b0\u1edbc file upload\n* N\u00e9n \u1ea3nh tr\u01b0\u1edbc khi l\u01b0u\n* T\u1ea1o thumbnail ph\u00f9 h\u1ee3p\n* Theo d\u00f5i dung l\u01b0\u1ee3ng th\u01b0\u1eddng xuy\u00ean\n* N\u00e2ng c\u1ea5p l\u00ean Starter khi project b\u1eaft \u0111\u1ea7u c\u00f3 ng\u01b0\u1eddi d\u00f9ng th\u1eadt\n\n### G\u00f3i Free c\u00f3 th\u1ec3 b\u1ecb x\u00f3a khi kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng\n\nInstance Free c\u00f3 ch\u00ednh s\u00e1ch t\u1ef1 \u0111\u1ed9ng x\u00f3a sau 30 ng\u00e0y kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng.\n\nKh\u00f4ng n\u00ean xem Free l\u00e0 n\u01a1i l\u01b0u tr\u1eef duy nh\u1ea5t cho d\u1eef li\u1ec7u quan tr\u1ecdng m\u00e0 kh\u00f4ng c\u00f3 backup ri\u00eang.\n\n### DDoS protection kh\u00f4ng c\u00f3 tr\u00ean Free\n\nTheo b\u1ea3ng so s\u00e1nh hi\u1ec7n t\u1ea1i, Free c\u00f3 ch\u1ee9ng ch\u1ec9 SSL nh\u01b0ng kh\u00f4ng bao g\u1ed3m DDoS protection.\n\nT\u00ednh n\u0103ng DDoS protection c\u00f3 tr\u00ean Starter v\u00e0 Pro.\n\n## K\u1ebft lu\u1eadn\n\nSau khi tr\u1ea3i nghi\u1ec7m PocketBase Cloud, t\u00f4i nh\u1eadn th\u1ea5y n\u1ec1n t\u1ea3ng n\u00e0y gi\u00fap qu\u00e1 tr\u00ecnh \u0111\u01b0a PocketBase l\u00ean Internet \u0111\u01a1n gi\u1ea3n h\u01a1n \u0111\u00e1ng k\u1ec3.\n\nThay v\u00ec ph\u1ea3i t\u1ef1 thi\u1ebft l\u1eadp VPS, reverse proxy, DNS v\u00e0 SSL, t\u00f4i c\u00f3 th\u1ec3 t\u1ea1o instance t\u1eeb dashboard r\u1ed3i t\u1eadp trung v\u00e0o collection, API Rules v\u00e0 logic c\u1ee7a \u1ee9ng d\u1ee5ng.\n\nG\u00f3i Free ph\u00f9 h\u1ee3p \u0111\u1ec3:\n\n* H\u1ecdc PocketBase\n* X\u00e2y d\u1ef1ng prototype\n* L\u00e0m landing page c\u00f3 backend\n* Th\u1eed nghi\u1ec7m realtime\n* Ch\u1ea1y m\u1ed9t side project nh\u1ecf\n\nG\u00f3i Starter ph\u00f9 h\u1ee3p h\u01a1n khi b\u1ea1n c\u1ea7n:\n\n* 3 GB storage\n* Custom domain\n* DDoS protection\n* L\u1ef1a ch\u1ecdn region\n* H\u1ed7 tr\u1ee3 qua email ho\u1eb7c Discord\n* Kh\u00f4ng b\u1ecb x\u00f3a sau 30 ng\u00e0y kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng\n\nG\u00f3i Pro ph\u00f9 h\u1ee3p khi b\u1ea1n c\u1ea7n:\n\n* Dedicated compute ri\u00eang\n* Nhi\u1ec1u PocketBase instance\n* Backend Node.js, Next.js, Deno ho\u1eb7c Bun\n* Nhi\u1ec1u frontend deployment\n* Monitoring\n* Priority support\n* Chi ph\u00ed c\u1ed1 \u0111\u1ecbnh thay v\u00ec tr\u1ea3 theo t\u1eebng deployment\n\nB\u1ea1n c\u00f3 th\u1ec3 b\u1eaft \u0111\u1ea7u t\u1ea1i [PocketBase Cloud](https:\/\/pocketbasecloud.com) v\u00e0 xem b\u1ea3ng gi\u00e1 m\u1edbi nh\u1ea5t t\u1ea1i [trang Pricing](https:\/\/pocketbasecloud.com\/pricing).\n\nGi\u00e1 v\u00e0 ch\u01b0\u01a1ng tr\u00ecnh gi\u1ea3m gi\u00e1 c\u00f3 th\u1ec3 thay \u0111\u1ed5i theo th\u1eddi gian, v\u00ec v\u1eady h\u00e3y ki\u1ec3m tra l\u1ea1i trang Pricing tr\u01b0\u1edbc khi \u0111\u0103ng k\u00fd.\n\nHy v\u1ecdng b\u00e0i vi\u1ebft n\u00e0y gi\u00fap b\u1ea1n tri\u1ec3n khai PocketBase instance \u0111\u1ea7u ti\u00ean nhanh h\u01a1n.\n\nCh\u00fac b\u1ea1n x\u00e2y d\u1ef1ng \u0111\u01b0\u1ee3c nhi\u1ec1u s\u1ea3n ph\u1ea9m th\u00fa v\u1ecb v\u1edbi PocketBaseCloud! \ud83d\ude80","published_at":"2026-08-05T05:12:27.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T16:40:03.000000Z","edited_at":"2026-08-05T08:28:56.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":14,"points":0,"views_count":26,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/565e006d-622c-4fef-a40e-8394a23f7eab.png","user":{"data":{"id":201786,"url":"https:\/\/viblo.asia\/u\/PhattTran097","avatar":"e92d1e69-3b5b-468d-a843-14d1629cda4d.png","name":"Phat tr\u1ea7n t\u1ea5n","username":"PhattTran097","followers_count":0,"reputation":0,"posts_count":1,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"lesson","name":"lesson"},{"slug":"phattrienbanthan","name":"PhatTrienBanThan"},{"slug":"backend-development","name":"Backend Development"},{"slug":"api","name":"API"}]},"commentators":{"data":[]}},{"id":102892,"title":"Series Clean Code Th\u1ef1c chi\u1ebfn #5: Ngh\u1ec7 thu\u1eadt thi\u1ebft k\u1ebf L\u1edbp (Classes) \u2013 B\u1ea3n thi\u1ebft k\u1ebf ho\u00e0n h\u1ea3o","slug":"bA4685K9LKv","url":"https:\/\/viblo.asia\/p\/series-clean-code-thuc-chien-5-nghe-thuat-thiet-ke-lop-classes-ban-thiet-ke-hoan-hao-bA4685K9LKv","user_id":182653,"moderation":null,"transliterated":"series-clean-code-thuc-chien-5-nghe-thuat-thiet-ke-lop-classes-ban-thiet-ke-hoan-hao","contents_short":"1. C\u1ea5u tr\u00fac chu\u1ea9n m\u1ef1c c\u1ee7a m\u1ed9t L\u1edbp (Quy t\u1eafc T\u1edd b\u00e1o)\n\nKhi b\u1ea1n m\u1edf m\u1ed9t t\u1edd b\u00e1o ra \u0111\u1ecdc, ti\u00eau \u0111\u1ec1 \u1edf tr\u00ean c\u00f9ng s\u1ebd t\u00f3m t\u1eaft n\u1ed9i dung, \u0111o\u1ea1n m\u1edf \u0111\u1ea7u cung c\u1ea5p \u00fd ch\u00ednh, v\u00e0 c\u00e1c chi ti\u1ebft t\u1ec9 m\u1ec9 nh\u1ea5t s\u1ebd n\u1eb1m \u1edf ph\u1ea7n d\u01b0\u1edbi c\u00f9ng. Code c\u1ee7a m\u1ed9t Class c\u0169ng ph\u1ea3i \u0111\u1ecdc y h\u1ec7t nh\u01b0 v\u1eady.\n\nTh\u1ee9 t\u1ef1 s\u1eafp x\u1ebfp chu\u1ea9n x\u00e1c trong m\u1ed9t file Class (nh\u01b0 PHP\/Laravel hay Golang struct):\n\n1. Danh s\u00e1ch Bi\u1ebfn (Properties): Public constants -> Private...","contents":"### 1. C\u1ea5u tr\u00fac chu\u1ea9n m\u1ef1c c\u1ee7a m\u1ed9t L\u1edbp (Quy t\u1eafc T\u1edd b\u00e1o)\n\nKhi b\u1ea1n m\u1edf m\u1ed9t t\u1edd b\u00e1o ra \u0111\u1ecdc, ti\u00eau \u0111\u1ec1 \u1edf tr\u00ean c\u00f9ng s\u1ebd t\u00f3m t\u1eaft n\u1ed9i dung, \u0111o\u1ea1n m\u1edf \u0111\u1ea7u cung c\u1ea5p \u00fd ch\u00ednh, v\u00e0 c\u00e1c chi ti\u1ebft t\u1ec9 m\u1ec9 nh\u1ea5t s\u1ebd n\u1eb1m \u1edf ph\u1ea7n d\u01b0\u1edbi c\u00f9ng. Code c\u1ee7a m\u1ed9t Class c\u0169ng ph\u1ea3i \u0111\u1ecdc y h\u1ec7t nh\u01b0 v\u1eady.\n\nTh\u1ee9 t\u1ef1 s\u1eafp x\u1ebfp chu\u1ea9n x\u00e1c trong m\u1ed9t file Class (nh\u01b0 PHP\/Laravel hay Golang struct):\n\n1. Danh s\u00e1ch Bi\u1ebfn (Properties): Public constants -> Private static variables -> Private instance variables.\n2. H\u00e0m kh\u1edfi t\u1ea1o (Constructor).\n3. C\u00e1c H\u00e0m Public (Public Methods): Nh\u1eefng h\u00e0m n\u00e0y ch\u00ednh l\u00e0 \"Ti\u00eau \u0111\u1ec1 t\u1edd b\u00e1o\", l\u00e0 API m\u1edf ra cho th\u1ebf gi\u1edbi b\u00ean ngo\u00e0i g\u1ecdi v\u00e0o.\n4. C\u00e1c H\u00e0m Private (Private Utility Methods): B\u1ea5t k\u1ef3 h\u00e0m public n\u00e0o g\u1ecdi \u0111\u1ebfn m\u1ed9t h\u00e0m private, th\u00ec h\u00e0m private \u0111\u00f3 ph\u1ea3i \u0111\u01b0\u1ee3c \u0111\u1eb7t ngay b\u00ean d\u01b0\u1edbi n\u00f3.\n\nNh\u1edd c\u1ea5u tr\u00fac n\u00e0y, khi ai \u0111\u00f3 m\u1edf file TransactionController.php c\u1ee7a b\u1ea1n, h\u1ecd ch\u1ec9 c\u1ea7n \u0111\u1ecdc t\u1eeb tr\u00ean xu\u1ed1ng d\u01b0\u1edbi l\u00e0 hi\u1ec3u \u0111\u01b0\u1ee3c b\u1ee9c tranh t\u1ed5ng th\u1ec3 m\u00e0 kh\u00f4ng c\u1ea7n ph\u1ea3i cu\u1ed9n chu\u1ed9t lung tung \u0111\u1ec3 t\u00ecm h\u00e0m h\u1ed7 tr\u1ee3.\n\n### 2. K\u00edch th\u01b0\u1edbc c\u1ee7a L\u1edbp: Nguy\u00ean l\u00fd Tr\u00e1ch nhi\u1ec7m \u0110\u01a1n l\u1ebb (SRP)\n\nV\u1edbi H\u00e0m, ch\u00fang ta \u0111\u1ebfm s\u1ed1 d\u00f2ng \u0111\u1ec3 \u0111o k\u00edch th\u01b0\u1edbc. Nh\u01b0ng v\u1edbi L\u1edbp, ch\u00fang ta \u0111o b\u1eb1ng \"Tr\u00e1ch nhi\u1ec7m\" (Responsibilities).\n\nNguy\u00ean l\u00fd SRP (Single Responsibility Principle) ph\u00e1t bi\u1ec3u: \"M\u1ed9t L\u1edbp ch\u1ec9 n\u00ean c\u00f3 M\u1ed8T l\u00fd do duy nh\u1ea5t \u0111\u1ec3 thay \u0111\u1ed5i.\"\n\nL\u1edbp \"\u0110a nh\u00e2n c\u00e1ch\" (God Class):\nH\u00e3y xem class TurnstileManager (Qu\u1ea3n l\u00fd c\u1ed5ng quay) d\u01b0\u1edbi \u0111\u00e2y:\n\n```\nclass TurnstileManager {\n    public function openGate($turnstileId) { ... }\n    public function closeGate($turnstileId) { ... }\n    \n    \/\/ \u0110\u1ed9t nhi\u00ean l\u1ea1i c\u00f3 h\u00e0m t\u00ednh doanh thu \u1edf \u0111\u00e2y???\n    public function calculateDailyRevenue($stationId) { ... }\n    \n    \/\/ L\u1ea1i c\u00f2n g\u1eedi email b\u00e1o c\u00e1o???\n    public function sendReportToManager($email) { ... }\n}\n```\n\nClass n\u00e0y c\u00f3 t\u1edbi 3 l\u00fd do \u0111\u1ec3 thay \u0111\u1ed5i:\n\n1. Khi logic \u0111\u00f3ng\/m\u1edf c\u1ed5ng thay \u0111\u1ed5i.\n2. Khi c\u00f4ng th\u1ee9c t\u00ednh ti\u1ec1n thay \u0111\u1ed5i.\n3. Khi format g\u1eedi email thay \u0111\u1ed5i.\nN\u00f3 \u00f4m \u0111\u1ed3m qu\u00e1 nhi\u1ec1u vi\u1ec7c v\u00e0 s\u1ebd t\u1ea1o ra nh\u1eefng xung \u0111\u1ed9t code (merge conflicts) li\u00ean t\u1ee5c khi l\u00e0m vi\u1ec7c nh\u00f3m.\n\nClean Code (T\u00e1ch L\u1edbp):\nH\u00e3y ch\u1ebb n\u00f3 ra th\u00e0nh 3 L\u1edbp ri\u00eang bi\u1ec7t: TurnstileController (\u0110i\u1ec1u khi\u1ec3n thi\u1ebft b\u1ecb), RevenueCalculator (T\u00ednh to\u00e1n ti\u1ec1n b\u1ea1c) v\u00e0 ReportNotifier (G\u1eedi th\u00f4ng b\u00e1o). H\u1ec7 th\u1ed1ng c\u1ee7a b\u1ea1n s\u1ebd c\u1ef1c k\u1ef3 d\u1ec5 b\u1ea3o tr\u00ec.\n\n### 3. \u0110\u1ecbnh lu\u1eadt Demeter (\u0110\u1eebng n\u00f3i chuy\u1ec7n v\u1edbi ng\u01b0\u1eddi l\u1ea1)\n\n\u0110\u00e2y l\u00e0 l\u1ed7i ph\u1ed5 bi\u1ebfn nh\u1ea5t khi\u1ebfn c\u00e1c th\u00e0nh ph\u1ea7n trong h\u1ec7 th\u1ed1ng d\u00ednh ch\u1eb7t v\u00e0o nhau (Tight Coupling). \u0110\u1ecbnh lu\u1eadt Demeter y\u00eau c\u1ea7u m\u1ed9t module kh\u00f4ng n\u00ean bi\u1ebft v\u1ec1 c\u1ea5u tr\u00fac b\u00ean trong c\u1ee7a c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng m\u00e0 n\u00f3 thao t\u00e1c.\n\nL\u1ed7i \"\u0110o\u00e0n t\u00e0u tr\u1eadt b\u00e1nh\" (Train Wreck):\n\n```\n\/\/ L\u1ea5y th\u1ebb -> L\u1ea5y Ch\u1ee7 th\u1ebb -> L\u1ea5y V\u00ed ti\u1ec1n -> Tr\u1eeb ti\u1ec1n\n$card->getOwner()->getWallet()->deduct(15000);\n```\n\n\u0110o\u1ea1n code tr\u00ean nh\u00ecn c\u00f3 v\u1ebb s\u00e0nh \u0111i\u1ec7u, nh\u01b0ng n\u00f3 l\u00e0 m\u1ed9t th\u1ea3m h\u1ecda. Class hi\u1ec7n t\u1ea1i ph\u1ea3i \"bi\u1ebft\" r\u1eb1ng Th\u1ebb ch\u1ee9a Ch\u1ee7 th\u1ebb, Ch\u1ee7 th\u1ebb ch\u1ee9a V\u00ed ti\u1ec1n. N\u1ebfu ng\u00e0y mai Database thay \u0111\u1ed5i, V\u00ed ti\u1ec1n g\u1eafn tr\u1ef1c ti\u1ebfp v\u00e0o Th\u1ebb ch\u1ee9 kh\u00f4ng qua Ch\u1ee7 th\u1ebb n\u1eefa, to\u00e0n b\u1ed9 h\u1ec7 th\u1ed1ng s\u1ebd g\u00e3y \u0111\u1ed5.\n\nClean Code (Tell, Don't Ask - Ra l\u1ec7nh, \u0111\u1eebng h\u1ecfi):\nB\u1ea1n ch\u1ec9 n\u00ean giao ti\u1ebfp v\u1edbi \"b\u1ea1n b\u00e8 tr\u1ef1c ti\u1ebfp\". Thay v\u00ec ch\u1ecdc s\u00e2u v\u00e0o c\u1ea5u tr\u00fac b\u00ean trong, h\u00e3y ra l\u1ec7nh cho \u0111\u1ed1i t\u01b0\u1ee3ng l\u00e0m vi\u1ec7c c\u1ee7a n\u00f3.\n\n```\n\/\/ Giao h\u1eb3n tr\u00e1ch nhi\u1ec7m tr\u1eeb ti\u1ec1n cho c\u00e1i Th\u1ebb. B\u00ean trong n\u00f3 t\u1ef1 x\u1eed l\u00fd.\n$card->chargeFare(15000);\n```\n\n### 4. T\u00ednh G\u1eafn k\u1ebft cao (Cohesion)\n\nM\u1ed9t L\u1edbp \u0111\u01b0\u1ee3c coi l\u00e0 c\u00f3 t\u00ednh g\u1eafn k\u1ebft cao n\u1ebfu n\u00f3 c\u00f3 m\u1ed9t s\u1ed1 l\u01b0\u1ee3ng nh\u1ecf c\u00e1c bi\u1ebfn instance (thu\u1ed9c t\u00ednh), v\u00e0 m\u1ecdi h\u00e0m trong l\u1edbp \u0111\u00f3 \u0111\u1ec1u thao t\u00e1c v\u1edbi m\u1ed9t ho\u1eb7c nhi\u1ec1u bi\u1ebfn n\u00e0y.\n\nN\u1ebfu b\u1ea1n c\u00f3 m\u1ed9t L\u1edbp ch\u1ee9a 5 bi\u1ebfn, nh\u01b0ng c\u00f3 m\u1ed9t h\u00e0m ch\u1ec9 d\u00f9ng duy nh\u1ea5t bi\u1ebfn th\u1ee9 5 v\u00e0 kh\u00f4ng bao gi\u1edd \u0111\u1ee5ng \u0111\u1ebfn 4 bi\u1ebfn kia, th\u00ec \u0111\u00f3 l\u00e0 d\u1ea5u hi\u1ec7u r\u00f5 r\u00e0ng cho th\u1ea5y c\u00e1i h\u00e0m \u0111\u00f3 (v\u00e0 c\u00e1i bi\u1ebfn \u0111\u00f3) \u0111ang \"n\u1eb1m nh\u1ea7m nh\u00e0\". B\u1ea1n c\u1ea7n t\u00e1ch ch\u00fang ra th\u00e0nh m\u1ed9t L\u1edbp m\u1edbi.\n\nB\u1eb1ng vi\u1ec7c thi\u1ebft k\u1ebf nh\u1eefng L\u1edbp nh\u1ecf g\u1ecdn, l\u00e0m \u0111\u00fang m\u1ed9t vi\u1ec7c v\u00e0 che gi\u1ea5u c\u1ea5u tr\u00fac d\u1eef li\u1ec7u b\u00ean trong, b\u1ea1n s\u1ebd x\u00e2y d\u1ef1ng \u0111\u01b0\u1ee3c nh\u1eefng module m\u00e3 ngu\u1ed3n \u0111\u1ed9c l\u1eadp. Gi\u1ed1ng nh\u01b0 c\u00e1c kh\u1ed1i Lego, b\u1ea1n c\u00f3 th\u1ec3 d\u1ec5 d\u00e0ng r\u00fat m\u1ed9t kh\u1ed1i ra s\u1eeda ch\u1eefa v\u00e0 l\u1eafp l\u1ea1i m\u00e0 kh\u00f4ng l\u00e0m s\u1eadp to\u00e0n b\u1ed9 l\u00e2u \u0111\u00e0i.","published_at":"2026-08-05T04:21:12.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T17:03:02.000000Z","edited_at":"2026-07-10T10:40:24.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":4,"points":0,"views_count":26,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/322622ce-7067-47f7-9b67-8087f9395f45.png","user":{"data":{"id":182653,"url":"https:\/\/viblo.asia\/u\/hhoang","avatar":"15b74a7e-16dd-435c-b375-62f02864e065.jpg","name":"Nguy\u1ec5n Huy Ho\u00e0ng","username":"hhoang","followers_count":144,"reputation":11227,"posts_count":987,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"ap-dung-solid","name":"\u00c1p d\u1ee5ng SOLID"},{"slug":"backend","name":"Backend"},{"slug":"clean-code","name":"Clean Code"},{"slug":"for-loop","name":"for loop"},{"slug":"softwareengineering","name":"SoftwareEngineering"}]},"commentators":{"data":[]}},{"id":104497,"title":"T\u1ea1i sao l\u1ea1i c\u1ea7n ph\u00e2n lo\u1ea1i Queue Channel? B\u00ed quy\u1ebft \"chia \u0111\u1ec3 tr\u1ecb\" gi\u00fap h\u1ec7 th\u1ed1ng Backend kh\u00f4ng bao gi\u1edd s\u1eadp ngu\u1ed3n","slug":"PoL7emYk4vk","url":"https:\/\/viblo.asia\/p\/tai-sao-lai-can-phan-loai-queue-channel-bi-quyet-chia-de-tri-giup-he-thong-backend-khong-bao-gio-sap-nguon-PoL7emYk4vk","user_id":182653,"moderation":null,"transliterated":"tai-sao-lai-can-phan-loai-queue-channel-bi-quyet-chia-de-tri-giup-he-thong-backend-khong-bao-gio-sap-nguon","contents_short":"Ch\u00e0o anh em!\n\nKhi x\u00e2y d\u1ef1ng c\u00e1c h\u1ec7 th\u1ed1ng Backend quy m\u00f4 l\u1edbn, vi\u1ec7c x\u1eed l\u00fd c\u00e1c t\u00e1c v\u1ee5 n\u1eb7ng (nh\u01b0 g\u1eedi email h\u00e0ng lo\u1ea1t, x\u1eed l\u00fd video, xu\u1ea5t b\u00e1o c\u00e1o) d\u01b0\u1edbi d\u1ea1ng n\u1ec1n background jobs l\u00e0 \u0111i\u1ec1u b\u1eaft bu\u1ed9c \u0111\u1ec3 gi\u1eef cho \u1ee9ng d\u1ee5ng lu\u00f4n m\u01b0\u1ee3t m\u00e0. Tuy nhi\u00ean, n\u1ebfu b\u1ea1n n\u00e9m m\u1ecdi th\u1ee9 v\u00e0o chung m\u1ed9t h\u00e0ng \u0111\u1ee3i (Default Queue) duy nh\u1ea5t, s\u1edbm mu\u1ed9n g\u00ec h\u1ec7 th\u1ed1ng c\u0169ng s\u1ebd r\u01a1i v\u00e0o c\u1ea3nh t\u1eafc ngh\u1ebdn tr\u1ea7m tr\u1ecdng.\n\n\u0110\u00f3 l\u00e0 l\u00fd do v\u00ec sao k\u1ef9 thu\u1eadt ph\u00e2...","contents":"Ch\u00e0o anh em!\n\nKhi x\u00e2y d\u1ef1ng c\u00e1c h\u1ec7 th\u1ed1ng Backend quy m\u00f4 l\u1edbn, vi\u1ec7c x\u1eed l\u00fd c\u00e1c t\u00e1c v\u1ee5 n\u1eb7ng (nh\u01b0 g\u1eedi email h\u00e0ng lo\u1ea1t, x\u1eed l\u00fd video, xu\u1ea5t b\u00e1o c\u00e1o) d\u01b0\u1edbi d\u1ea1ng n\u1ec1n background jobs l\u00e0 \u0111i\u1ec1u b\u1eaft bu\u1ed9c \u0111\u1ec3 gi\u1eef cho \u1ee9ng d\u1ee5ng lu\u00f4n m\u01b0\u1ee3t m\u00e0. Tuy nhi\u00ean, n\u1ebfu b\u1ea1n n\u00e9m m\u1ecdi th\u1ee9 v\u00e0o chung m\u1ed9t h\u00e0ng \u0111\u1ee3i (Default Queue) duy nh\u1ea5t, s\u1edbm mu\u1ed9n g\u00ec h\u1ec7 th\u1ed1ng c\u0169ng s\u1ebd r\u01a1i v\u00e0o c\u1ea3nh t\u1eafc ngh\u1ebdn tr\u1ea7m tr\u1ecdng.\n\n\u0110\u00f3 l\u00e0 l\u00fd do v\u00ec sao k\u1ef9 thu\u1eadt ph\u00e2n lo\u1ea1i Queue Channel (chia t\u00e1ch c\u00e1c k\u00eanh h\u00e0ng \u0111\u1ee3i) ra \u0111\u1eddi nh\u01b0 m\u1ed9t v\u1ecb c\u1ee9u tinh. H\u00f4m nay, h\u00e3y c\u00f9ng m\u1ed5 x\u1ebb l\u00fd do t\u1ea1i sao ch\u00fang ta b\u1eaft bu\u1ed9c ph\u1ea3i ph\u00e2n lo\u1ea1i Queue Channel trong c\u00e1c ki\u1ebfn tr\u00fac hi\u1ec7n \u0111\u1ea1i nh\u00e9!\n\n## 1. Tr\u00e1nh hi\u1ec7n t\u01b0\u1ee3ng \"N\u00fat th\u1eaft c\u1ed5 chai\" (Head-of-Line Blocking)\n\n\u0110\u00e2y l\u00e0 l\u00fd do c\u1ed1t l\u00f5i nh\u1ea5t. H\u00e3y t\u01b0\u1edfng t\u01b0\u1ee3ng h\u1ec7 th\u1ed1ng c\u1ee7a b\u1ea1n c\u00f3 hai lo\u1ea1i c\u00f4ng vi\u1ec7c:\n*   **C\u00f4ng vi\u1ec7c c\u1ea5p b\u00e1ch:** G\u1eedi m\u00e3 OTP x\u00e1c th\u1ef1c \u0111\u0103ng nh\u1eadp ho\u1eb7c th\u00f4ng b\u00e1o giao d\u1ecbch th\u00e0nh c\u00f4ng cho ng\u01b0\u1eddi d\u00f9ng (c\u1ea7n x\u1eed l\u00fd trong v\u00f2ng ch\u01b0a \u0111\u1ea7y 1 gi\u00e2y).\n*   **C\u00f4ng vi\u1ec7c n\u1eb7ng nh\u1ecdc:** Xu\u1ea5t file Excel b\u00e1o c\u00e1o doanh thu ch\u1ee9a h\u00e0ng tri\u1ec7u d\u00f2ng d\u1eef li\u1ec7u (m\u1ea5t t\u1eeb 3 \u0111\u1ebfn 5 ph\u00fat \u0111\u1ec3 ch\u1ea1y xong).\n\nN\u1ebfu d\u00f9ng chung m\u1ed9t Queue duy nh\u1ea5t, h\u00e0ng ch\u1ee5c t\u00e1c v\u1ee5 xu\u1ea5t file n\u1eb7ng s\u1ebd x\u1ebfp h\u00e0ng ch\u1eafn ngay tr\u01b0\u1edbc m\u1eb7t c\u00e1c m\u00e3 OTP c\u1ee7a ng\u01b0\u1eddi d\u00f9ng. K\u1ebft qu\u1ea3 l\u00e0 kh\u00e1ch h\u00e0ng ph\u1ea3i m\u00f2n m\u1ecfi ch\u1edd \u0111\u1ee3i ch\u1ec9 v\u00ec server \u0111ang b\u1eadn c\u00e0y cu\u1ed1c \u0111\u1ed1ng b\u00e1o c\u00e1o.\n\n**Gi\u1ea3i ph\u00e1p ph\u00e2n lo\u1ea1i Channel:** B\u1eb1ng c\u00e1ch t\u00e1ch th\u00e0nh `channel:otp` v\u00e0 `channel:reports`, h\u1ec7 th\u1ed1ng c\u00f3 th\u1ec3 c\u1ea5u h\u00ecnh cho Worker \u01b0u ti\u00ean tuy\u1ec7t \u0111\u1ed1i x\u1eed l\u00fd k\u00eanh OTP tr\u01b0\u1edbc, gi\u00fap tr\u1ea3i nghi\u1ec7m ng\u01b0\u1eddi d\u00f9ng lu\u00f4n m\u01b0\u1ee3t m\u00e0 tuy\u1ec7t \u0111\u1ed1i.\n\n## 2. Ph\u00e2n b\u1ed5 t\u00e0i nguy\u00ean th\u00f4ng minh cho Worker (Resource Allocation)\n\nKh\u00f4ng ph\u1ea3i t\u00e1c v\u1ee5 n\u00e0o c\u0169ng ng\u1ed1n l\u01b0\u1ee3ng t\u00e0i nguy\u00ean ph\u1ea7n c\u1ee9ng (CPU\/RAM) nh\u01b0 nhau. Ph\u00e2n lo\u1ea1i Queue Channel cho ph\u00e9p b\u1ea1n \u0111\u1ecbnh h\u00ecnh chi\u1ebfn l\u01b0\u1ee3c c\u1ea5p ph\u00e1t t\u00e0i nguy\u00ean c\u1ef1c k\u1ef3 linh ho\u1ea1t:\n*   B\u1ea1n c\u00f3 th\u1ec3 c\u1ea5p t\u1edbi 10 worker chuy\u00ean tr\u00e1ch ch\u1ea1y li\u00ean t\u1ee5c cho `channel:orders` (x\u1eed l\u00fd \u0111\u01a1n h\u00e0ng thanh to\u00e1n ti\u1ec1n b\u1ea1c).\n*   Ch\u1ec9 c\u1ea7n c\u1ea5p 1 worker l\u1ea7m l\u0169i ch\u1ea1y ng\u1ea7m cho `channel:newsletter` (g\u1eedi email qu\u1ea3ng c\u00e1o tu\u1ea7n m\u1ed9t l\u1ea7n).\n\nVi\u1ec7c n\u00e0y gi\u00fap t\u1ed1i \u01b0u h\u00f3a tuy\u1ec7t \u0111\u1ed1i s\u1ee9c m\u1ea1nh c\u1ee7a server, kh\u00f4ng \u0111\u1ec3 t\u00e0i nguy\u00ean b\u1ecb l\u00e3ng ph\u00ed v\u00e0o c\u00e1c t\u00e1c v\u1ee5 \u00edt quan tr\u1ecdng.\n\n## 3. C\u00f4 l\u1eadp l\u1ed7i v\u00e0 ng\u0103n ch\u1eb7n hi\u1ec7u \u1ee9ng d\u00e2y chuy\u1ec1n (Fault Isolation)\n\nTrong th\u1ef1c t\u1ebf v\u1eadn h\u00e0nh, vi\u1ec7c d\u1ecbch v\u1ee5 b\u00ean th\u1ee9 ba (nh\u01b0 c\u1ed5ng thanh to\u00e1n, API b\u00ean ngo\u00e0i, hay SMTP server g\u1eedi mail) g\u1eb7p s\u1ef1 c\u1ed1 l\u00e0 \u0111i\u1ec1u kh\u00f3 tr\u00e1nh kh\u1ecfi.\n*   N\u1ebfu kh\u00f4ng ph\u00e2n lo\u1ea1i channel, khi m\u1ed9t l\u00f4 email marketing b\u1ecb l\u1ed7i v\u00e0 li\u00ean t\u1ee5c v\u0103ng ngo\u1ea1i l\u1ec7 (Failed Jobs), h\u00e0ng \u0111\u1ee3i chung s\u1ebd b\u1ecb ngh\u1ebdn v\u00e0 v\u00f4 t\u00ecnh k\u00e9o theo c\u00e1c t\u00e1c v\u1ee5 quan tr\u1ecdng kh\u00e1c s\u1eadp theo.\n*   Khi ph\u00e2n lo\u1ea1i th\u00e0nh c\u00e1c channel \u0111\u1ed9c l\u1eadp (v\u00ed d\u1ee5: `channel:emails` v\u00e0 `channel:transactions`), n\u1ebfu k\u00eanh email g\u1eb7p s\u1ef1 c\u1ed1, n\u00f3 ch\u1ec9 l\u00e0m gi\u00e1n \u0111o\u1ea1n ch\u00ednh n\u00f3. To\u00e0n b\u1ed9 c\u00e1c k\u00eanh giao d\u1ecbch ti\u1ec1n b\u1ea1c hay \u0111\u1ecbnh danh kh\u00e1c v\u1eabn ch\u1ea1y tr\u01a1n tru kh\u00f4ng h\u1ec1 b\u1ecb \u1ea3nh h\u01b0\u1edfng.\n\n## 4. D\u1ec5 d\u00e0ng gi\u00e1m s\u00e1t v\u00e0 \u01b0u ti\u00ean h\u00f3a nghi\u1ec7p v\u1ee5 (Monitoring & Priority)\n\nKhi h\u1ec7 th\u1ed1ng l\u1edbn l\u00ean, \u0111\u1ed9i ng\u0169 k\u1ef9 thu\u1eadt c\u1ea7n bi\u1ebft ch\u00ednh x\u00e1c khu v\u1ef1c n\u00e0o \u0111ang b\u1ecb qu\u00e1 t\u1ea3i. Vi\u1ec7c chia t\u00e1ch c\u00e1c channel r\u00f5 r\u00e0ng gi\u00fap:\n*   D\u1ec5 d\u00e0ng theo d\u00f5i l\u01b0\u1ee3ng t\u1ed3n \u0111\u1ecdng (Queue Backlog) tr\u00ean t\u1eebng lu\u1ed3ng ri\u00eang bi\u1ec7t th\u00f4ng qua c\u00e1c c\u00f4ng c\u1ee5 gi\u00e1m s\u00e1t nh\u01b0 Laravel Horizon ho\u1eb7c Redis CLI.\n*   D\u1ec5 d\u00e0ng \u0111i\u1ec1u ch\u1ec9nh \u0111\u1ed9 \u01b0u ti\u00ean khi kh\u1edfi ch\u1ea1y c\u00e1c worker tr\u00ean server (v\u00ed d\u1ee5: `php artisan queue:work --queue=high,default,low`).\n\n## L\u1eddi k\u1ebft\n\nPh\u00e2n lo\u1ea1i Queue Channel gi\u1ed1ng nh\u01b0 vi\u1ec7c quy ho\u1ea1ch h\u1ec7 th\u1ed1ng giao th\u00f4ng th\u00e0nh c\u00e1c l\u00e0n \u0111\u01b0\u1eddng ri\u00eang bi\u1ec7t (l\u00e0n \u00f4 t\u00f4, l\u00e0n xe m\u00e1y, l\u00e0n c\u1ee9u th\u01b0\u01a1ng). Hi\u1ec3u v\u00e0 \u00e1p d\u1ee5ng th\u00e0nh c\u00f4ng m\u00f4 h\u00ecnh n\u00e0y s\u1ebd gi\u00fap h\u1ec7 th\u1ed1ng Backend c\u1ee7a b\u1ea1n ch\u1ecbu t\u1ea3i c\u1ef1c t\u1ed1t, v\u1eadn h\u00e0nh \u1ed5n \u0111\u1ecbnh v\u00e0 s\u1eb5n s\u00e0ng b\u1ee9t ph\u00e1 khi l\u01b0\u1ee3ng ng\u01b0\u1eddi d\u00f9ng t\u0103ng v\u1ecdt!","published_at":"2026-08-05T04:18:30.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T16:40:02.000000Z","edited_at":"2026-07-31T03:20:03.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":5,"points":0,"views_count":26,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/cece5911-1ed8-4ebb-8385-91de95d9280c.png","user":{"data":{"id":182653,"url":"https:\/\/viblo.asia\/u\/hhoang","avatar":"15b74a7e-16dd-435c-b375-62f02864e065.jpg","name":"Nguy\u1ec5n Huy Ho\u00e0ng","username":"hhoang","followers_count":144,"reputation":11227,"posts_count":987,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"backend","name":"Backend"}]},"commentators":{"data":[]}},{"id":104771,"title":"X\u00e2y D\u1ef1ng M\u00f4 H\u00ecnh D\u1ef1 \u0110o\u00e1n Kh\u00e1ch H\u00e0ng R\u1eddi B\u1ecf (Customer Churn Prediction) B\u1eb1ng Deep Learning","slug":"kY4gDp2lJAe","url":"https:\/\/viblo.asia\/p\/xay-dung-mo-hinh-du-doan-khach-hang-roi-bo-customer-churn-prediction-bang-deep-learning-kY4gDp2lJAe","user_id":190335,"moderation":"approved","transliterated":"xay-dung-mo-hinh-du-doan-khach-hang-roi-bo-customer-churn-prediction-bang-deep-learning","contents_short":"Trong b\u1ed1i c\u1ea3nh c\u1ea1nh tranh gay g\u1eaft \u1edf c\u00e1c l\u0129nh v\u1ef1c nh\u01b0 Banking, Fintech, Telecom hay Subscription Services, gi\u1eef ch\u00e2n kh\u00e1ch h\u00e0ng hi\u1ec7n t\u1ea1i (Customer Retention) lu\u00f4n l\u00e0 \u01b0u ti\u00ean h\u00e0ng \u0111\u1ea7u. Nhi\u1ec1u nghi\u00ean c\u1ee9u ch\u1ec9 ra r\u1eb1ng, chi ph\u00ed \u0111\u1ec3 ti\u1ebfp th\u1ecb m\u1ed9t kh\u00e1ch h\u00e0ng m\u1edbi cao h\u01a1n g\u1ea5p 5\u20137 l\u1ea7n so v\u1edbi chi ph\u00ed duy tr\u00ec m\u1ed9t kh\u00e1ch h\u00e0ng c\u0169.\n\n\u0110\u1ec3 gi\u1ea3i quy\u1ebft b\u00e0i to\u00e1n kinh doanh th\u1ef1c t\u1ebf n\u00e0y, vi\u1ec7c \u1ee9ng d\u1ee5ng Machine Learning\/Deep ...","contents":"Trong b\u1ed1i c\u1ea3nh c\u1ea1nh tranh gay g\u1eaft \u1edf c\u00e1c l\u0129nh v\u1ef1c nh\u01b0 Banking, Fintech, Telecom hay Subscription Services, gi\u1eef ch\u00e2n kh\u00e1ch h\u00e0ng hi\u1ec7n t\u1ea1i (Customer Retention) lu\u00f4n l\u00e0 \u01b0u ti\u00ean h\u00e0ng \u0111\u1ea7u. Nhi\u1ec1u nghi\u00ean c\u1ee9u ch\u1ec9 ra r\u1eb1ng, chi ph\u00ed \u0111\u1ec3 ti\u1ebfp th\u1ecb m\u1ed9t kh\u00e1ch h\u00e0ng m\u1edbi cao h\u01a1n g\u1ea5p 5\u20137 l\u1ea7n so v\u1edbi chi ph\u00ed duy tr\u00ec m\u1ed9t kh\u00e1ch h\u00e0ng c\u0169.\n\n\u0110\u1ec3 gi\u1ea3i quy\u1ebft b\u00e0i to\u00e1n kinh doanh th\u1ef1c t\u1ebf n\u00e0y, vi\u1ec7c \u1ee9ng d\u1ee5ng [Machine Learning\/Deep Learning](https:\/\/cole.vn\/san-pham\/khoa-hoc-ai-engineer-942) nh\u1eb1m d\u1ef1 \u0111o\u00e1n nguy c\u01a1 kh\u00e1ch h\u00e0ng r\u1eddi b\u1ecf (Customer Churn Prediction) gi\u00fap doanh nghi\u1ec7p ch\u1ee7 \u0111\u1ed9ng \u0111\u01b0a ra c\u00e1c ch\u01b0\u01a1ng tr\u00ecnh ch\u0103m s\u00f3c ph\u00f9 h\u1ee3p tr\u01b0\u1edbc khi qu\u00e1 mu\u1ed9n. B\u00e0i vi\u1ebft n\u00e0y s\u1ebd chia s\u1ebb chi ti\u1ebft m\u1ed9t d\u1ef1 \u00e1n th\u1ef1c t\u1ebf v\u1ec1 d\u1ef1 \u0111o\u00e1n Customer Churn s\u1eed d\u1ee5ng m\u1ea1ng th\u1ea7n kinh nh\u00e2n t\u1ea1o (Deep Learning).\n\n## 1. T\u1ed5ng Quan B\u00e0i To\u00e1n & B\u1ed9 D\u1eef Li\u1ec7u Churn Prediction\n**M\u1ee5c ti\u00eau d\u1ef1 \u00e1n**\nD\u1ef1 \u0111o\u00e1n s\u1edbm: X\u00e1c \u0111\u1ecbnh ch\u00ednh x\u00e1c nh\u00f3m kh\u00e1ch h\u00e0ng c\u00f3 nguy c\u01a1 d\u1eebng s\u1eed d\u1ee5ng d\u1ecbch v\u1ee5.\n\nTr\u00edch xu\u1ea5t Insight: Ph\u00e2n t\u00edch c\u00e1c y\u1ebfu t\u1ed1 ch\u00ednh t\u00e1c \u0111\u1ed9ng \u0111\u1ebfn h\u00e0nh vi r\u1eddi b\u1ecf.\n\nT\u1ed1i \u01b0u h\u00f3a ngu\u1ed3n l\u1ef1c: Gi\u00fap b\u1ed9 ph\u1eadn Marketing v\u00e0 CSKH t\u1eadp trung \u01b0u \u0111\u00e3i cho \u0111\u00fang \u0111\u1ed1i t\u01b0\u1ee3ng c\u00f3 r\u1ee7i ro cao.\n![image.png](https:\/\/images.viblo.asia\/27cc5849-143f-4c7a-9d40-98ce4e7a28ea.png)\n\n**B\u1ed9 d\u1eef li\u1ec7u (Dataset)**\nD\u1ef1 \u00e1n s\u1eed d\u1ee5ng t\u1eadp d\u1eef li\u1ec7u g\u1ed3m 10.000 kh\u00e1ch h\u00e0ng v\u1edbi c\u00e1c thu\u1ed9c t\u00ednh ch\u00ednh:\n\nTh\u00f4ng tin c\u00e1 nh\u00e2n & T\u00e0i kho\u1ea3n: \u0110\u1ed9 tu\u1ed5i (Age), Gi\u1edbi t\u00ednh (Gender), Qu\u1ed1c gia (Geography), \u0110i\u1ec3m t\u00edn d\u1ee5ng (Credit Score), S\u1ed1 n\u0103m g\u1eafn b\u00f3 (Tenure).\n\nH\u00e0nh vi s\u1eed d\u1ee5ng: S\u1ed1 d\u01b0 t\u00e0i kho\u1ea3n (Balance), S\u1ed1 l\u01b0\u1ee3ng s\u1ea3n ph\u1ea9m \u0111\u0103ng k\u00fd (Number of Products), M\u1ee9c l\u01b0\u01a1ng \u01b0\u1edbc t\u00ednh (Estimated Salary).\n\nNh\u00e3n m\u1ee5c ti\u00eau (Exited): 1 n\u1ebfu kh\u00e1ch h\u00e0ng r\u1eddi b\u1ecf, 0 n\u1ebfu \u1edf l\u1ea1i.\n\n## 2. Quy Tr\u00ecnh Pipeline Ti\u1ec1n X\u1eed L\u00fd D\u1eef Li\u1ec7u & Hu\u1ea5n Luy\u1ec7n M\u00f4 H\u00ecnh\n\u0110\u1ec3 x\u1eed l\u00fd b\u00e0i to\u00e1n d\u1eef li\u1ec7u d\u1ea1ng b\u1ea3ng (Tabular Data), quy tr\u00ecnh Pipeline \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf ch\u1eb7t ch\u1ebd qua c\u00e1c b\u01b0\u1edbc:\n\n`[Kh\u00e1m ph\u00e1 d\u1eef li\u1ec7u (EDA)] \u2794 [X\u1eed l\u00fd Feature & Encoding] \u2794 [Chu\u1ea9n h\u00f3a & C\u00e2n b\u1eb1ng SMOTE] \u2794 [Hu\u1ea5n luy\u1ec7n Neural Network]`\n1. Kh\u00e1m ph\u00e1 & Ph\u00e2n t\u00edch d\u1eef li\u1ec7u (EDA): Ki\u1ec3m tra c\u1ea5u tr\u00fac d\u1eef li\u1ec7u, t\u00ecm ra s\u1ef1 ph\u00e2n b\u1ed5 v\u00e0 m\u1ed1i t\u01b0\u01a1ng quan gi\u1eefa c\u00e1c bi\u1ebfn.\n2. L\u00e0m s\u1ea1ch & Bi\u1ebfn \u0111\u1ed5i thu\u1ed9c t\u00ednh:\n- Lo\u1ea1i b\u1ecf c\u00e1c tr\u01b0\u1eddng kh\u00f4ng mang gi\u00e1 tr\u1ecb d\u1ef1 b\u00e1o (nh\u01b0 ID kh\u00e1ch h\u00e0ng, T\u00ean).\n- One-Hot Encoding: Bi\u1ebfn \u0111\u1ed5i c\u00e1c thu\u1ed9c t\u00ednh \u0111\u1ecbnh danh (Geography, Gender) th\u00e0nh d\u1ea1ng s\u1ed1.\n![image.png](https:\/\/images.viblo.asia\/fa9d50a3-65b9-4862-94ea-f379c8e4ca1c.png)\n3. X\u1eed l\u00fd Outlier & Chu\u1ea9n h\u00f3a:\n- S\u1eed d\u1ee5ng ph\u01b0\u01a1ng ph\u00e1p IQR (Interquartile Range) \u0111\u1ec3 ph\u00e1t hi\u1ec7n v\u00e0 lo\u1ea1i b\u1ecf nhi\u1ec5u.\n- S\u1eed d\u1ee5ng StandardScaler \u0111\u1ec3 \u0111\u01b0a c\u00e1c thu\u1ed9c t\u00ednh s\u1ed1 v\u1ec1 c\u00f9ng m\u1ed9t quy m\u00f4 (Scale).\n\n4. X\u1eed l\u00fd M\u1ea5t c\u00e2n b\u1eb1ng d\u1eef li\u1ec7u: \u1ee8ng d\u1ee5ng k\u1ef9 thu\u1eadt SMOTE (Synthetic Minority Over-sampling Technique) \u0111\u1ec3 sinh d\u1eef li\u1ec7u nh\u00e2n t\u1ea1o cho nh\u00f3m kh\u00e1ch h\u00e0ng r\u1ee7i ro churn (v\u1ed1n chi\u1ebfm t\u1ef7 l\u1ec7 \u00edt h\u01a1n).\n5. Hu\u1ea5n luy\u1ec7n M\u00f4 h\u00ecnh Deep Learning:\n- X\u00e2y d\u1ef1ng m\u1ea1ng Fully Connected Neural Network (Dense Architecture).\n- T\u00edch h\u1ee3p Batch Normalization gi\u00fap m\u00f4 h\u00ecnh h\u1ed9i t\u1ee5 nhanh h\u01a1n, Dropout \u0111\u1ec3 ch\u1ed1ng Overfitting v\u00e0 Early Stopping \u0111\u1ec3 d\u1eebng hu\u1ea5n luy\u1ec7n \u0111\u00fang th\u1eddi \u0111i\u1ec3m.\n=> K\u1ebft qu\u1ea3 \u0111\u1ea1t \u0111\u01b0\u1ee3c: M\u00f4 h\u00ecnh ch\u1ea1m m\u1ed1c Accuracy ~92.8% tr\u00ean b\u1ed9 d\u1eef li\u1ec7u th\u1eed nghi\u1ec7m.\n\n## 3. C\u00e1c Insight Quan Tr\u1ecdng R\u00fat Ra T\u1eeb D\u1eef Li\u1ec7u\nQu\u00e1 tr\u00ecnh ph\u00e2n t\u00edch EDA mang l\u1ea1i nhi\u1ec1u ph\u00e1t hi\u1ec7n c\u00f3 gi\u00e1 tr\u1ecb cho chi\u1ebfn l\u01b0\u1ee3c kinh doanh:\n* T\u1ef7 l\u1ec7 Churn t\u1ef1 nhi\u00ean: Chi\u1ebfm kho\u1ea3ng 20% t\u1ed5ng s\u1ed1 kh\u00e1ch h\u00e0ng.\n* Y\u1ebfu t\u1ed1 \u0110\u1ed9 tu\u1ed5i: Kh\u00e1ch h\u00e0ng l\u1edbn tu\u1ed5i c\u00f3 xu h\u01b0\u1edbng r\u1eddi b\u1ecf d\u1ecbch v\u1ee5 cao h\u01a1n r\u00f5 r\u1ec7t so v\u1edbi nh\u00f3m tr\u1ebb tu\u1ed5i.\n* Ph\u00e2n v\u00f9ng \u0110\u1ecba l\u00fd: Kh\u00e1ch h\u00e0ng \u0111\u1ebfn t\u1eeb th\u1ecb tr\u01b0\u1eddng \u0110\u1ee9c c\u00f3 t\u1ef7 l\u1ec7 churn cao b\u1ea5t th\u01b0\u1eddng so v\u1edbi c\u00e1c qu\u1ed1c gia c\u00f2n l\u1ea1i trong t\u1eadp d\u1eef li\u1ec7u.\n* S\u1ed1 d\u01b0 & S\u1ea3n ph\u1ea9m: Kh\u00e1ch h\u00e0ng c\u00f3 s\u1ed1 d\u01b0 t\u00e0i kho\u1ea3n th\u1ea5p ho\u1eb7c nh\u00f3m s\u1eed d\u1ee5ng 3\u20134 s\u1ea3n ph\u1ea9m c\u00f9ng l\u00fac l\u1ea1i c\u00f3 t\u1ef7 l\u1ec7 r\u1eddi b\u1ecf t\u01b0\u01a1ng \u0111\u1ed1i cao.\n* \u0110i\u1ec3m t\u00edn d\u1ee5ng (Credit Score): Ch\u01b0a cho th\u1ea5y m\u1ed1i t\u01b0\u01a1ng quan r\u00f5 r\u00e0ng v\u1edbi h\u00e0nh vi churn trong t\u1eadp d\u1eef li\u1ec7u n\u00e0y.\n![image.png](https:\/\/images.viblo.asia\/333c0ece-5555-4a55-97d8-697eadbae740.png)\n## 4. B\u00e0i H\u1ecdc R\u00fat Ra \u0110\u1ec3 \u0110\u01b0a M\u00f4 H\u00ecnh V\u00e0o Th\u1ef1c T\u1ebf Business\nM\u1eb7c d\u00f9 \u0111\u1ed9 ch\u00ednh x\u00e1c (Accuracy) \u0111\u1ea1t tr\u00ean 92%, vi\u1ec7c \u0111\u01b0a m\u00f4 h\u00ecnh v\u00e0o h\u1ec7 th\u1ed1ng v\u1eadn h\u00e0nh th\u1ef1c t\u1ebf (Production) v\u1eabn \u0111\u00f2i h\u1ecfi nhi\u1ec1u tinh ch\u1ec9nh quan tr\u1ecdng t\u1eeb g\u00f3c nh\u00ecn ph\u1ea3n bi\u1ec7n:\n\n### A. \u0110\u00e1nh gi\u00e1 \u0111a chi\u1ec1u v\u1edbi b\u1ed9 Metric ph\u00f9 h\u1ee3p\n\u0110\u1ed1i v\u1edbi b\u00e0i to\u00e1n imbalanced data nh\u01b0 Churn Prediction, ch\u1ec9 s\u1ed1 Accuracy d\u1ec5 g\u00e2y ng\u1ed9 nh\u1eadn. C\u1ea7n b\u1ed5 sung c\u00e1c ch\u1ec9 s\u1ed1 \u0111o l\u01b0\u1eddng n\u00e2ng cao:\n\nPrecision & Recall: Gi\u00fap c\u00e2n b\u1eb1ng gi\u1eefa vi\u1ec7c \"d\u1ef1 \u0111o\u00e1n nh\u1ea7m kh\u00e1ch h\u00e0ng trung th\u00e0nh\" v\u00e0 \"b\u1ecf s\u00f3t kh\u00e1ch h\u00e0ng r\u1ee7i ro\".\n\nF1-Score & ROC-AUC: \u0110\u00e1nh gi\u00e1 n\u0103ng l\u1ef1c ph\u00e2n lo\u1ea1i t\u1ed5ng th\u1ec3 c\u1ee7a m\u00f4 h\u00ecnh.\n\nConfusion Matrix: Nh\u00ecn r\u00f5 s\u1ed1 l\u01b0\u1ee3ng ca d\u1ef1 \u0111o\u00e1n \u0111\u00fang\/sai th\u1ef1c t\u1ebf.\n\n### B. Ki\u1ec3m so\u00e1t hi\u1ec7n t\u01b0\u1ee3ng Overfitting\nS\u1ef1 ch\u00eanh l\u1ec7ch gi\u1eefa \u0111\u01b0\u1eddng bi\u1ec3u di\u1ec5n hu\u1ea5n luy\u1ec7n (Training Curve) v\u00e0 ki\u1ec3m th\u1eed (Validation Curve) cho th\u1ea5y m\u00f4 h\u00ecnh v\u1eabn c\u00f2n d\u1ea5u hi\u1ec7u Overfitting. C\u1ea7n \u0111i\u1ec1u ch\u1ec9nh m\u1ee9c \u0111\u1ed9 Dropout, \u0111i\u1ec1u ch\u1ec9nh T\u1ef7 l\u1ec7 h\u1ecdc (Learning Rate), ho\u1eb7c \u0111\u01a1n gi\u1ea3n h\u00f3a ki\u1ebfn tr\u00fac m\u1ea1ng.\n\n### C. Y\u1ebfu t\u1ed1 Th\u1eddi \u0111i\u1ec3m D\u1ef1 \u0111o\u00e1n (Time-to-Predict)\nM\u1ed9t m\u00f4 h\u00ecnh d\u1ef1 \u0111o\u00e1n churn ch\u1ec9 th\u1ef1c s\u1ef1 hi\u1ec7u qu\u1ea3 n\u1ebfu d\u1ef1 \u0111o\u00e1n \u0111\u1ee7 s\u1edbm. N\u1ebfu m\u00f4 h\u00ecnh ph\u00e1t hi\u1ec7n r\u1ee7i ro v\u00e0o ng\u00e0y kh\u00e1ch h\u00e0ng n\u1ed9p \u0111\u01a1n h\u1ee7y d\u1ecbch v\u1ee5, doanh nghi\u1ec7p s\u1ebd kh\u00f4ng c\u00f2n th\u1eddi gian h\u00e0nh \u0111\u1ed9ng. C\u00e1c thu\u1ed9c t\u00ednh th\u1eddi gian (Time-series features) c\u1ea7n \u0111\u01b0\u1ee3c t\u00edch h\u1ee3p v\u00e0o m\u00f4 h\u00ecnh.\n![image.png](https:\/\/images.viblo.asia\/62379f02-41ca-47f4-9c35-407b945fc2a9.png)\n## 5. Th\u1ea3o Lu\u1eadn & M\u1edf R\u1ed9ng B\u00e0i To\u00e1n (Q&A)\nD\u01b0\u1edbi \u0111\u00e2y l\u00e0 m\u1ed9t s\u1ed1 g\u00f3c nh\u00ecn m\u1edf r\u1ed9ng \u0111\u1ec3 n\u00e2ng cao hi\u1ec7u qu\u1ea3 b\u00e0i to\u00e1n Customer Churn:\n*** N\u00ean d\u00f9ng Deep Learning hay GBDT (XGBoost\/LightGBM)?**\n\u0110\u1ed1i v\u1edbi d\u1eef li\u1ec7u d\u1ea1ng b\u1ea3ng (Tabular Data), c\u00e1c m\u00f4 h\u00ecnh c\u00e2y quy\u1ebft \u0111\u1ecbnh c\u1ea3i ti\u1ebfn nh\u01b0 XGBoost, LightGBM hay CatBoost th\u01b0\u1eddng mang l\u1ea1i hi\u1ec7u n\u0103ng cao h\u01a1n, \u00edt t\u1ed1n t\u00e0i nguy\u00ean v\u00e0 d\u1ec5 gi\u1ea3i th\u00edch (Explainable AI) h\u01a1n Deep Learning.\n*** L\u00e0m sao \u0111\u1ec3 m\u00f4 h\u00ecnh \u1ee9ng d\u1ee5ng t\u1ed1t h\u01a1n?**\nC\u1ea7n k\u1ebft h\u1ee3p th\u00eam k\u1ef9 thu\u1eadt SHAP ho\u1eb7c LIME \u0111\u1ec3 gi\u1ea3i th\u00edch cho b\u1ed9 ph\u1eadn kinh doanh bi\u1ebft v\u00ec sao m\u1ed9t kh\u00e1ch h\u00e0ng c\u1ee5 th\u1ec3 l\u1ea1i b\u1ecb m\u00f4 h\u00ecnh g\u1eafn nh\u00e3n c\u00f3 nguy c\u01a1 churn.","published_at":"2026-08-05T04:04:49.000000Z","scheduled_publish_at":null,"is_published":true,"is_shared":false,"updated_at":"2026-08-05T13:00:08.000000Z","edited_at":"2026-08-05T04:06:52.000000Z","translation_source":null,"trend_at":null,"promoted_at":null,"reading_time":7,"points":0,"views_count":18,"clips_count":0,"comments_count":0,"rated_value":null,"promoted":false,"trending":false,"is_draft":false,"is_public":true,"locale_code":"vi","is_video":false,"thumbnail_url":"https:\/\/images.viblo.asia\/fa9d50a3-65b9-4862-94ea-f379c8e4ca1c.png","user":{"data":{"id":190335,"url":"https:\/\/viblo.asia\/u\/quochuy247","avatar":"b789db50-333f-4d2d-807b-10acb2832e63.jpg","name":"Huy Qu\u1ed1c","username":"quochuy247","followers_count":2,"reputation":22,"posts_count":43,"banned_at":null,"level_partner":null,"following":false}},"tags":{"data":[{"slug":"churn-prediction","name":"Churn Prediction"},{"slug":"deep-learning","name":"Deep Learning"},{"slug":"ai-engineer","name":"ai engineer"}]},"commentators":{"data":[]}}],"meta":{"pagination":{"total":49609,"count":20,"per_page":20,"current_page":1,"total_pages":2481,"links":{"next":"http:\/\/viblo.asia\/posts?page=2"}}}}