چه‌جوری سریع یه سیستم مانیتورینگ راه‌اندازی کنیم؟

اینجا میخوام توضیح بدم که چه‌جوری میشه خیلی سریع یه سیستم مانیتورینگ برای مانیتور کردن Resource روی سرورها اضافه کرد.ابزاری که ما در تخفیفان اضافه کردیم و تونستیم خیلی راحت لود رو روی تمام سرورهامون ببینیم ترکیب Grafana و Prometheus بود.Grafana چیه؟یه ابزار طبعا اوپن سورس که کارش نمایش داده‌ها و کشیدن نمودارهای مختلف هست.Prometheus چیه؟یک ابزار برای جمع‌آوری دیتا از نقاط مختلف. این سرویس میتونه دیتای لازم رو از هر سروری بخونه و تو خودش نگه داره و با استفاده از زبانی که برای کوئری کردن دیتا داره میشه دیتا رو در زمان‌های مختلف دید و ازش نمودار به دست آورد.ترکیب این ۲ تا سرویس با هم اینجوریه که Prometheus دیتا رو جمع میکنه و نگه‌داری میکنه. بعد از اون کار Grafana آینه که این دیتا رو بخونه و تو نمودارهای مختلفی که میخواین نشون بده. به عنوان مثال این یه نمودار خیلی ساده از CPU Load روی یکی از سرورهاست در بازه زمانی ۶ ساعت.توصیه میکنم حتما اول یک بار روی لوکال خودتون این مراحل رو برید و هر کاری دوست داشتید بکنید و بعدش به سرور منتقل کنین. چه‌جوری ستاپ کنیم؟برای ستاپ کردن ترجیح و توصیه من استفاده از داکر هست چون خیلی سریع و راحت میتونین اینا رو به هم وصل کنین. من اینجا یه سمپل خیلی ساده از فایل docker-compose میذارم و قسمت‌های مختلف اون رو در ادامه توضیح میدم.version: "3" services: prometheus: image: prom/prometheus volumes: - /home/apps/system_monitoring/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - /home/apps/system_monitoring/prometheus/data:/prometheus ports: - '127.0.0.1:9090:9090' network_mode: bridge extra_hosts: my_server: 127.0.0.1 grafana: image: grafana/grafana environment: GF_DATABASE_TYPE: postgres GF_DATABASE_HOST: 'postgres' GF_DATABASE_NAME: 'grafana' GF_DATABASE_USER: 'postgres' GF_DATABASE_PASSWORD: '' ports: - '127.0.0.1:3100:3000' links: - prometheus - postgres user: "1000" network_mode: bridge volumes: - /home/apps/system_monitoring/grafana/data:/var/lib/grafana - /var/log/grafana:/var/log/grafana depends_on: - postgres postgres: image: postgres:latest environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: POSTGRES_DB: grafana volumes: - /home/apps/system_monitoring/postgres:/var/lib/postgresql/data - /var/log/postgres:/var/log/postgresql network_mode: bridgeقسمت اول:prometheus: image: prom/prometheus volumes: - /home/apps/system_monitoring/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - /home/apps/system_monitoring/prometheus/data:/prometheus ports: - '127.0.0.1:9090:9090' network_mode: bridge extra_hosts: my_server: 127.0.0.1در قسمت volumes دایرکتوری‌هایی که پرومتئوس برای نگه‌داری دیتا و همچنین فایل تنظیماتش رو مشخص کردیم. پورتی که به صورت پیش‌فرض فعال هست هم پورت 9090 هست که اون رو برای لوکال باز گذاشتیم که اگر لازم بود بتونیم بهش دسترسی داشته باشیم. در قسمت extra_hosts هم باید آدرس تمام سرورهایی که میخواین دیتا رو ازشون بخونین به همراه آیپی بذارین. اینکه این هاست‌ها کجا به درد میخورن رو تو تنظیماتی که باید انجام بدیم متوجه میشید.قسمت دوم: grafana: image: grafana/grafana environment: GF_DATABASE_TYPE: postgres GF_DATABASE_HOST: 'postgres' GF_DATABASE_NAME: 'grafana' GF_DATABASE_USER: 'postgres' GF_DATABASE_PASSWORD: '' ports: - '127.0.0.1:3100:3000' links: - prometheus - postgres user: "1000" network_mode: bridge volumes: - /home/apps/system_monitoring/grafana/data:/var/lib/grafana - /var/log/grafana:/var/log/grafana depends_on: - postgresگرافانا به صورت پیش‌فرض از دیتابیس sqlite استفاده میکنه برای نگه‌داری تمام داده‌هایی که داره ولی چون ما ترجیح میدادیم که یه دیتابیس مطمئن‌تر داشته باشیم تصمیم گرفتیم از postgres استفاده کنیم. تمام مواردی هم که در قسمت environment اومده هم برای برقراری ارتباط با دیتابیس هست. توی داکیومنت خودش میتونید ببینید چه دیتابیس‌هایی رو پشتیبانی میکنه و از هرکدوم که دوست داشتین استفاده کنید.در قسمت ports هم باید پورت ۳۰۰۰ کانتینر گرافانا که به صورت پیش‌فرض وجود داره رو به یه پورت دلخواه در سیستم هاست بفرستین که بتونید به پنل گرافانا دسترسی داشته باشید.User: یکی از مهم‌ترین چیزهایی که در ستاپ گرافانا به گیر خواهید خورد قرار دادن permission درست برای فولدرهای گرافانا و یوزری که قراره تو اون فولدرها دیتا بنویسه خواهد بود. چرا ۱۰۰۰؟ این مقدار رو باید با اجرای این کامند توسط یوزری که قراره این سرویس رو اجرا کنه به دست میادecho $(id -u)قسمت سوم: postgres: image: postgres:latest environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: POSTGRES_DB: grafana volumes: - /home/apps/system_monitoring/postgres:/var/lib/postgresql/data - /var/log/postgres:/var/log/postgresql network_mode: bridgeتو این قسمت هم که فقط دیتابیس postgres رو اضافه کردیم و تنظیمات لازم رو قرار دادیم که گرافانا بتونه بهش وصل شه و دیتایی که لازم داره رو ذخیره کنه.بعد از اینکه این فایل رو در مسیری که میخواهید قرار دادید لازمه که دایرکتوری‌های لازمی که تو این فایل بهشون اشاره شده رو بسازید و permission های اونها رو ست کنید.mkdir prometheus/datasudo chown -R 65534:65534 prometheus/data/چرا 65534؟ این یوزری هست که داخل کانتینر prometheus داره کار میکنه و اگر permission نداشته باشه نمیتونه هیچ چیزی رو داخل این فولدر سیو کنه. پس بهش دسترسی میدیم که بدون مشکل کارش رو انجام بده.تنظیمات prometheus کجاست؟فایل prometheus.yml فایلی هست که کلیه تنظیماتی که به سرویس پرومتئوس میگه چه دیتایی رو چه‌جوری و از کدوم سرور بخون داخل خودش نگه میداره. این فایل به صورت نمونه میاد دیتای همین سروری که دارید روش ستاپ انجام میدید رو نگه داری میکنه. فقط لازمه که محتویات زیر رو داخل آدرس زیر بذارید.prometheus/prometheus.ymlمحتویات تنظیمات prometheus:global: scrape_interval: 15s # By default, scrape targets every 15 seconds scrape_configs: - job_name: node static_configs: - targets: - '127.0.0.1:9100'مهم‌ترین قسمت تو این فایل قسمت targets هست که لیست سرورهایی که میخواهید ببینید رو قرار میدید. extra_hosts که در فایل docker-compose.yml برای پرمتئوس هم قرار دادیم برای همینه که این کانتینر بتونه به راحتی و با استفاده از اسم هاست بهشون وصل بشه بجای اینکه هی آی‌پی بذارید و یادتون بره که این کدوم سرور بود.پورت ۹۱۰۰ دیگه چیه؟خب قراره یه سرویسی وجود داشته باشه که دیتا رو برای prometheus بفرسته یا بشه رفت ازش این دیتا رو گرفت. لازم داریم که یه سرویسی رو روی پورت ۹۱۰۰ ایجاد کنیم که این دیتا رو برامون جمع‌آوری کنه و promethus با خوندن و نگه داشتن اون دیتا بتونه بهمون گزارش بده.node_exporter حلال مسائلاین سرویس که توسط خود تیم prometheus نوشته شده و خب طبعا مثل بقیه سرویس‌هایی که استفاده کردیم اوپن سورس هم هست این امکان رو میده که دیتاهایی که لازم هست مثلاً لود سی‌پی‌یو، وضعیت فضای هارد دیسک‌ها و پارتیشن‌های مختلف، نتورک و خیلی چیزای دیگه رو جمع آوری کنه. داخل پروژه گیت‌هاب این سرویس نوشته که چه‌جوری میتونین اون رو نصب کنین. فقط لازمه Go Compiler رو نصب داشته باشید. بعدش به راحتی میتونین با اجرای دستورات زیر این سرویس رو اجرا کنید.go get github.com/prometheus/node_exporter cd ${GOPATH-$HOME/go}/src/github.com/prometheus/node_exporter make ./node_exporter <flags>خب این سرویس میاد به صورت پیش‌فرض تمام دیتاهایی که فکر میکنه لازم هست(این دیتاها رو از طریق flags میتونین عوض کنین) رو شروع به اندازه‌گیری میکنه.خب دیگه وقتشه که یه سری نمودار خوشگل ببینیمهمونجوری که سرویس node_exporter در حال اجرا هست کامند docker-compose up رو اجرا کنید تا پرومتئوس و گرافانا و پستگرس به هم وصل بشن و بشه یه سری نمودار دید.بعد از اینکه هر سه تای اینا کامل اجرا شدن و بالا اومدن میتونین آدرس زیر رو بزنید و وارد پنل گرافانا بشید.یوزر و پسورد دیفالت هم admin هستش.http://localhost:3100خب اینجا که هیچی نیست :(آره خب لازمه برید تو قسمت تنظیمات گرافانا و Data source رو بهش معرفی کنید.دکمه Add data source رو بزنیدو فیلدهاش رو مقدارهای زیر رو وارد کنید.Name: PrometheusType: PrometheusURL: http://prometheus:9090Access: Server(Default)بقیه فیلدها رو هم همون چیزی که هست بذارید بمونه. بعد از اینکه فیلدها رو وارد کردید دکمه Save & test رو بزنید که ذخیره بشه.هنوز هم که هیچی نشون نمیده :((خب دیگه همه چی آماده است و فقط باید بری داخل قسمت import dashboard و داشبورد زیر رو ایمپورت کنید.https://grafana.com/dashboards/1860بعدش که برید داخل این داشبورد کلی ذوق میکنید.لینک‌های به درد بخورhttps://prometheus.io/docs/introduction/overview/http://docs.grafana.org/https://grafana.com/dashboardshttps://github.com/prometheus/node_exporterhttps://grafana.com/dashboards/1860