Docker telah menjadi teknologi penting dalam aplikasi moden, tetapi menggunakan Docker untuk pemantauan aplikasi dan pengurusan log adalah satu cabaran. Dengan peningkatan berterusan fungsi rangkaian Docker, seperti Penemuan Perkhidmatan dan Pengimbangan Beban, kami semakin memerlukan sistem pemantauan aplikasi yang lengkap, stabil dan cekap.
Dalam artikel ini, kami akan memperkenalkan secara ringkas penggunaan Docker untuk pemantauan aplikasi dan pengurusan log serta memberikan contoh kod khusus.
Prometheus ialah sumber terbuka, alat pemantauan perkhidmatan dan amaran berasaskan model Tarik yang dibangunkan oleh SoundCloud. Ia ditulis dalam bahasa Go dan digunakan secara meluas dalam penyelesaian perkhidmatan mikro dan persekitaran awan. Sebagai alat pemantauan, ia boleh memantau CPU, memori, rangkaian dan cakera Docker, dsb., dan juga menyokong penukaran data berbilang dimensi, pertanyaan fleksibel, penggera dan fungsi visualisasi, membolehkan anda bertindak balas dengan cepat dan membuat keputusan dengan cepat.
Satu lagi perkara yang perlu diambil perhatian ialah Prometheus perlu membuat sampel melalui mod Tarik, iaitu, mengakses antara muka /metrics dalam aplikasi yang dipantau untuk mendapatkan data pemantauan. Oleh itu, apabila memulakan imej aplikasi yang dipantau, anda perlu terlebih dahulu mengkonfigurasi IP dan port yang boleh mengakses Prometheus ke dalam antara muka /metrics. Di bawah ialah aplikasi Node.js yang mudah.
const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hello World!') }) app.get('/metrics', (req, res) => { res.send(` # HELP api_calls_total Total API calls # TYPE api_calls_total counter api_calls_total 100 `) }) app.listen(3000, () => { console.log('Example app listening on port 3000!') })
Dalam kod ini, kami mengembalikan penunjuk pemantauan api_calls_total melalui antara muka /metrics.
Seterusnya, muat turun imej Docker Prometheus daripada tapak web rasmi dan buat fail docker-compose.yml, dan dalam fail ini, kami memperoleh data aplikasi Node.js.
version: '3' services: node: image: node:lts command: node index.js ports: - 3000:3000 prometheus: image: prom/prometheus:v2.25.2 volumes: - ./prometheus:/etc/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.retention.time=15d' ports: - 9090:9090
Dalam fail docker-compose.yml, kami mentakrifkan dua perkhidmatan, satu ialah perkhidmatan Node yang menjalankan aplikasi Node.js, dan satu lagi ialah perkhidmatan Prometheus untuk pemantauan. Antaranya, port yang diterbitkan oleh perkhidmatan Node ialah port 3000. Melalui pemetaan port, antara muka /metrics aplikasi Node boleh diakses melalui IP dan port 3000 dalam docker-compose.yml. Prometheus boleh mengakses data penunjuk pemantauan yang sepadan melalui port 9090.
Akhir sekali, dalam fail prometheus.yml, kita perlu menentukan sumber data yang hendak diperolehi.
global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: 'node-exporter' static_configs: - targets: ['node:9100'] - job_name: 'node-js-app' static_configs: - targets: ['node:3000']
Dalam fail ini, kami mentakrifkan penunjuk semua aplikasi Node.js yang akan dikumpulkan, dengan parameter sasaran ialah alamat IP aplikasi Node.js dan nombor portnya yang sepadan. Di sini, kami menggunakan nod dan port 3000.
Akhir sekali, jalankan arahan docker-compose up untuk memulakan keseluruhan aplikasi dan perkhidmatan pemantauannya, dan lihat metrik ahli dalam Prometheus.
Dalam Docker, data log aplikasi diedarkan dalam bekas Docker yang berbeza. Jika anda ingin mengurus log ini di tempat terpusat, anda boleh menggunakan ElasticSearch dan Logstash dalam ELK untuk mengurus log secara berpusat, menjadikannya lebih mudah untuk memantau dan menganalisis sumber komputer.
Sebelum anda bermula, anda perlu memuat turun imej Docker Logstash dan ElasticSearch dan mencipta fail docker-compose.yml.
Dalam fail ini, kami mentakrifkan tiga perkhidmatan, antaranya bls ialah perkhidmatan API yang digunakan untuk mensimulasikan log perniagaan Selepas setiap respons, log akan direkodkan ke fail stdout dan log. Perkhidmatan logstash dibina daripada imej Docker yang disediakan secara rasmi oleh Logstash dan digunakan untuk mengumpul, menapis dan menghantar log. Perkhidmatan ElasticSearch digunakan untuk menyimpan dan mendapatkan semula log.
version: '3' services: bls: image: nginx:alpine volumes: - ./log:/var/log/nginx - ./public:/usr/share/nginx/html:ro ports: - "8000:80" logging: driver: "json-file" options: max-size: "10m" max-file: "10" logstash: image: logstash:7.10.1 volumes: - ./logstash/pipeline:/usr/share/logstash/pipeline environment: - "ES_HOST=elasticsearch" depends_on: - elasticsearch elasticsearch: image: elasticsearch:7.10.1 environment: - "http.host=0.0.0.0" - "discovery.type=single-node" volumes: - ./elasticsearch:/usr/share/elasticsearch/data
Dalam fail konfigurasi, kami memetakan laluan dalam bekas ke sistem fail log hos. Pada masa yang sama, melalui pilihan pembalakan, saiz volum dan kuantiti log ditakrifkan untuk mengehadkan storan yang diduduki oleh log.
Dalam fail konfigurasi logstash, kami mentakrifkan saluran paip baharu bernama nginx_pipeline.conf
, yang digunakan untuk mengendalikan pengumpulan, penapisan dan penghantaran log nginx. Sama seperti cara ELK berfungsi, logstash akan memproses log yang diterima berdasarkan keadaan berbeza dan menghantarnya ke kelompok Elasticsearch yang telah dibuat. Dalam fail konfigurasi ini, kami mentakrifkan logik pemprosesan berikut: nginx_pipeline.conf
,该文件用于处理nginx日志的收集、过滤和传输。与ELK的工作原理相同,logstash将根据不同的条件,对接收到的日志进行处理,并将其发送到已经创建的 Elasticsearch 集群中。在该配置文件中,我们定义了如下处理逻辑:
input { file { path => "/var/log/nginx/access.log" } } filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } } output { elasticsearch { hosts => [ "${ES_HOST}:9200" ] index => "nginx_log_index" } }
在该配置文件中,我们定义了一个name为file的输入,表示要从本地Log文件中读取数据。接着,我们引入了使用grok库来解析符合特定模板的日志的filter。最后,我们定义了输出,其将数据传输到 Elasticsearch 集群的地址,同时将检索和报告通过环境变量ES_HOST
rrreee
ES_HOST
. Akhirnya, selepas melengkapkan keseluruhan konfigurasi ELK seperti di atas, kami akan mendapat sistem pengurusan log yang cekap Setiap log akan dihantar ke tempat berpusat dan disepadukan, membolehkan operasi carian, penapisan dan visualisasi mudah. 🎜Atas ialah kandungan terperinci Cara menggunakan Docker untuk pemantauan aplikasi dan pengurusan log. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!