Computer >> Máy Tính >  >> Lập trình >> Ruby

Xây dựng hệ thống giám sát thời gian hoạt động trong Ruby với GCE, Cloud Storage và PubSub

Giám sát thời gian hoạt động liên quan đến việc kiểm tra tính khả dụng của các trang web, API và máy chủ. Màn hình thăm dò một điểm cuối nhất định trong một khoảng thời gian xác định để xác định xem nó có khả dụng hay không. Mục tiêu là đạt được mức độ sẵn sàng theo hợp đồng, như được chỉ định trong SLA của hệ thống và xác định sự khác biệt khi hợp đồng không được đáp ứng.

Trong bài viết này, chúng tôi sẽ xây dựng một hệ thống giám sát thời gian hoạt động dựa trên Prometheus blackbox_exporter. Mặc dù việc xây dựng một hệ thống giám sát HTTP tùy chỉnh có thể là việc nhỏ, nhưng việc xây dựng một trình bao bọc xung quanh nhà xuất khẩu cho phép chúng tôi truy cập vào nhiều kỹ thuật thăm dò khác và nhanh chóng giám sát các yếu tố khác trong hệ thống của chúng tôi.

Bài viết này đề cập đến việc sử dụng một số công nghệ và tôi sẽ mô tả từng thành phần trước khi đi sâu vào chi tiết của hệ thống thời gian hoạt động.

Google Compute Engine (GCE) là gì?

Compute Engine là dịch vụ điện toán đám mây của Google tương tự như dịch vụ điện toán EC2 của AWS. GCE đủ an toàn và có thể tùy chỉnh để phù hợp với nhiều khối lượng công việc khác nhau, từ máy nhỏ (hỗ trợ tối đa 32 vCPU và bộ nhớ 128 GB) đến máy tiêu chuẩn (hỗ trợ tối đa 224 vCPU và bộ nhớ 896 GB) và các máy cao cấp khác cho khối lượng công việc chuyên sâu. Nó sử dụng máy tính theo yêu cầu để mở rộng theo nhu cầu của bạn theo thời gian.

GCE hỗ trợ các cơ chế triển khai khác nhau để triển khai ứng dụng, bao gồm vùng chứa, mẫu phiên bản và nhóm phiên bản được quản lý. Với mục đích của bài viết này, chúng tôi sẽ gói bộ theo dõi thời gian hoạt động của Ruby vào một bộ chứa docker để triển khai.

Lưu trữ đám mây là gì?

Google Cloud Storage là một dịch vụ lưu trữ đối tượng có tính khả dụng cao tương tự như dịch vụ S3 của AWS. Cloud Storage cung cấp nhiều tính năng lưu trữ cho phép một số trường hợp sử dụng cho các ứng dụng hiện đại. Để bắt đầu với Cloud Storage trong Ruby, chúng tôi sẽ sử dụng google-cloud-storage gem để xác thực, cũng như tải lên và tải xuống các tệp từ Cloud Storage:

require 'google/cloud/storage'

def upload_file bucket_name:, file_path:, file_name: nil
 storage = Google::Cloud::Storage.new
 bucket = storage.bucket bucket_name

 file = bucket.create_file file_path, file_name
end

def download_file bucket_name: file_path, file_name: nil
 storage = Google::Cloud::Storage.new
 bucket = storage.bucket bucket_name
 file = bucket.file file_name

 file.download file_path
end

Lưu ý :Bạn cần thiết lập GOOGLE_APPLICATION_CREDENTIALS trong môi trường của bạn để trỏ đến đúng khóa tài khoản dịch vụ. Tất cả các gem khách hàng của Google đều tìm kiếm biến môi trường này để cấp phép; nếu không, bạn sẽ cần chuyển các thông số xác thực cụ thể cho Google::Cloud::Storage.new . Tuy nhiên, nếu ứng dụng của bạn đang chạy trong máy ảo GCE, điều này đã được thiết lập trong môi trường.

Cloud PubSub là gì?

Cloud PubSub là một dịch vụ nhắn tin đăng ký / xuất bản được cung cấp bởi Google Cloud. Hình thức giao tiếp này được sử dụng để tạo điều kiện giao tiếp giữa dịch vụ và dịch vụ không đồng bộ, tương tự như SNS của AWS. Xây dựng hệ thống với giao tiếp không đồng bộ có thể giúp cải thiện hiệu suất, khả năng mở rộng và độ tin cậy của hệ thống của chúng tôi. Để bắt đầu với Cloud PubSub trong Ruby, chúng tôi sẽ sử dụng google-cloud-pubsub gem để xác thực, xuất bản và lắng nghe trên các sự kiện:

require 'google/cloud/pubsub'

def publish_message topic_id:, message: nil
 pubsub = Google::Cloud::Pubsub.new
 topic = pubsub.topic topic_id

 topic.publish_async message do |result|
  raise "Failed to publish message" unless result.succeeded?
  puts "Message published asynchronously"
 end

 topic.async_publisher.stop.wait!
rescue StandardError => e
 puts "Received error while publishing: #{e.message}"
end

def receive_message subscription_id: nil, wait_time: 200.seconds
 pubsub = Google::Cloud::Pubsub.new

 subscription = pubsub.subscription subscription_id
 subscriber = subscription.listen do |received_message|
  puts "Received message: #{received_message.data}"
  received_message.acknowledge!
 end

 subscriber.start
 sleep wait_time
end

Lưu ý :Xác thực được mô tả cho Cloud Storage cũng được áp dụng tại đây.

Khi tận dụng Cloud Storage và PubSub, chúng ta có thể xây dựng các giải pháp rất thú vị. Thông thường, chúng tôi muốn tải lên một đối tượng và theo dõi các cập nhật - đó là vòng đời - tạo, cập nhật, xóa và thực hiện các hành động cụ thể dựa trên các sự kiện nhất định. Nếu điều này vẫn có vẻ trừu tượng, hãy khám phá hai trường hợp sử dụng:

  • Dịch vụ Hình ảnh:Xây dựng Dịch vụ Hình ảnh. Giả sử chúng tôi muốn tạo ra thứ gì đó tương tự như Cloudinary để cung cấp khả năng lưu trữ hình ảnh và video cũng như thực hiện các chuyển đổi trên những dữ liệu này. Mặc dù Cloud Storage có thể giúp lưu trữ và tạo phiên bản dữ liệu, nhưng với PubSub, chúng tôi có thể lắng nghe các sự kiện từ một nhóm và thực hiện một số kiểu xử lý trước đối với dữ liệu, ngay cả trước khi khách hàng yêu cầu phiên bản xử lý trước.
  • Phân phối các tệp cấu hình. Một vấn đề phổ biến trong kỹ thuật cơ sở hạ tầng là triển khai cấu hình cho một số máy chủ và cung cấp khả năng khôi phục dễ dàng. Hãy tưởng tượng rằng chúng tôi muốn có một máy chủ trung tâm chịu trách nhiệm về cấu hình máy chủ và chúng tôi muốn cập nhật cấu hình một lần và phân phối cấu hình cho một nhóm máy chủ của chúng tôi. Bằng cách sử dụng Cloud Storage và Cloud PubSub, chúng tôi có thể xây dựng các tác nhân trên máy chủ của chúng tôi lắng nghe thông qua PubSub để nhận thông báo về đối tượng và thực hiện hành động dựa trên các sự kiện này. Hơn nữa, trong trường hợp đó là một thay đổi không tốt (thay đổi cấu hình sai là lý do phổ biến gây ra thời gian ngừng hoạt động 😩), chúng tôi có thể thực hiện khôi phục với lập phiên bản đối tượng.

Trong bài viết này, chúng tôi sẽ xây dựng một trình bao bọc Ruby cho Blackbox Exporter bằng cách sử dụng trường hợp sử dụng thứ hai được mô tả ở trên. Trình bao bọc sẽ chạy trình xuất trong một quy trình và chạy quy trình khác để theo dõi các thay đổi cấu hình từ nhóm trong GCP, sau đó tải lại trực tiếp trình xuất. Bạn đã sẵn sàng chưa? Hãy vui vẻ!

Blackbox Exporter là gì?

Blackbox Exporter là một công cụ mã nguồn mở do nhóm Prometheus xây dựng để thăm dò các điểm cuối qua HTTP, HTTPS, DNS, TCP và ICMP. Nhà xuất khẩu nên được triển khai cùng với việc triển khai Grafana và Prometheus. Thiết lập hoàn chỉnh trông giống như sau:

Xây dựng hệ thống giám sát thời gian hoạt động trong Ruby với GCE, Cloud Storage và PubSub

Trình bao bọc Hộp đen thăm dò tất cả các điểm cuối được định cấu hình và Prometheus loại bỏ nhà xuất khẩu giống như bất kỳ mục tiêu nào khác. Sau đó, Grafana lấy dữ liệu từ Prometheus để được vẽ biểu đồ. Chúng tôi chạy tệp nhị phân của nhà xuất khẩu như blackbox_exporter --config.file blackbox.yml . Blackbox Exporter cũng cho phép chúng tôi tải lại trực tiếp trình xuất với cấu hình mới mà không cần tắt tệp nhị phân và khởi động lại. Điều này có thể rất hữu ích khi rà soát các điểm cuối với khoảng thời gian được tính bằng giây.

Thông số dịch vụ của BlackboxWrapper

Trước khi đi sâu vào mã, hãy làm nổi bật các thông số dịch vụ:

  • BlackboxWrapper dịch vụ sẽ chạy hai quy trình.
    • Quá trình đầu tiên chạy blackbox_exporter nhị phân.
    • Quy trình thứ hai lắng nghe các thay đổi nhóm từ GCP và khởi động lại quy trình đầu tiên.
  • Dịch vụ sẽ được triển khai dưới dạng hình ảnh docker, cho phép chúng tôi đóng gói dịch vụ cùng với blackbox_exporter nhị phân.

Xây dựng hệ thống giám sát thời gian hoạt động trong Ruby với GCE, Cloud Storage và PubSub

Hãy bắt đầu xây dựng

Đầu tiên, tạo một thư mục ứng dụng và sau đó nhập thư mục.

mkdir blackbox-wrapper && cd blackbox-wrapper

Giống như ứng dụng Ruby tiêu chuẩn của chúng tôi, chúng tôi sẽ sử dụng bundler để quản lý sự phụ thuộc của trình bao bọc của chúng tôi. Tạo một Gemfile:

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

ruby '2.7.2'

gem 'google-cloud-storage'
gem 'google-cloud-pubsub'
gem 'rake'
gem 'pry'

Sau đó chạy bundle install .

Bây giờ chúng ta sẽ tạo một tệp để chứa mã của chúng ta:app.rb .

Tệp này sẽ đóng vai trò là điểm truy cập vào dịch vụ của chúng tôi. Vì chúng tôi sẽ triển khai ứng dụng của mình trong một vùng chứa, nên tệp này sẽ được chỉ định trong CMD trong Dockerfile của chúng tôi sau này.

touch app.rb

Tạo Dockerfile

Mặc dù một số mục đã được chủ ý bỏ qua khỏi tệp này. đoạn mã dưới đây nêu bật các thành phần quan trọng cần thiết cho bài viết này:

FROM ruby:2.7.2

RUN mkdir /app
WORKDIR /app
COPY . .

# Install other dependencies
...

# Download & Install blackbox exporter
RUN curl -SL \
    https://github.com/prometheus/blackbox_exporter/releases/download/v0.18.0/blackbox_exporter-0.18.0.linux-386.tar.gz | \
    tar xvz -C /tmp && \
    mv /tmp/blackbox_exporter-0.18.0.linux-386/blackbox_exporter /usr/local/bin && \
    mkdir /etc/blackbox && \
    mv /tmp/blackbox_exporter-0.18.0.linux-386/blackbox.yml /etc/blackbox/

# Specify entry point.
CMD ["bundle", "exec", "ruby", "app.rb" ]

Từ những điều trên, chúng ta cần lưu ý những điều sau:

  • Chúng tôi đã sử dụng hình ảnh Ruby - ruby:2.7.2 - dưới dạng hình ảnh cơ sở có cài đặt Ruby.
  • Chúng tôi đã cài đặt blackbox_exporter nhị phân và di chuyển nó vào một thư mục có thể truy cập từ PATH của chúng tôi .
  • Chúng tôi đã chỉ định điểm vào của vùng chứa để chạy app.rb khi khởi động vùng chứa.

Xây dựng Dịch vụ Wrapper

Đây là dịch vụ Ruby của chúng tôi để gắn kết mọi thứ lại với nhau. Trong main.rb , đặt như sau:

require 'rubygems'
require 'bundler/setup'
require "google/cloud/pubsub"
require "google/cloud/storage"

CONFIG_BUCKET = ENV['BUCKET_NAME']
TOPIC = ENV['PUBSUB_TOPIC']
TOPIC_SUBSCRIPTION = ENV['TOPIC_SUBSCRIPTION']

class ProcessNotification

  def initialize(file, attr, blackbox_exporter)
    @file = file
    @attr = attr
    @blackbox_exporter = blackbox_exporter
  end

  def call
    return if @attr['eventType'] == 'OBJECT_DELETE'

    @blackbox_exporter.write @file
    @blackbox_exporter.reload
  end
end

class BlackBoxExporter
  CONFIG_FILE = '/etc/blackbox/blackbox.yml'

  def initialize
    @blackbox_pid = nil
  end

  def start
    return unless @blackbox_pid.nil?

    @blackbox_pid = fork do
      exec('blackbox_exporter', '--config.file', CONFIG_FILE)
    end
  end

  def write(file)
    file.download CONFIG_FILE
  end

  def reload
    # Send SIGHUP signal
    Process.kill('HUP', @blackbox_pid)
  end

  def shutdown
    Process.kill('KILL', @blackbox_pid)
  end
end

class Subscriber
  class NotificationConfigError < StandardError
  end

  SUPPORTED_FILE_TYPES = ['blackbox.yml']

  def initialize(blackbox_exporter)
    @pubsub = Google::Cloud::Pubsub.new
    @storage = Google::Cloud::Storage.new
    @subscription_name = ENV['TOPIC_SUBSCRIPTION']  # Retrieve a subscription
    @bucket = @storage.bucket CONFIG_BUCKET
    @subscription = @pubsub.subscription @subscription_name
    @blackbox_exporter = blackbox_exporter
  end

  def listen
    create_notification_config

    puts "Starting subscriber"

    @subscriber = @subscription.listen do |received_message|
      process_notification(received_message)
    end

    @subscriber.on_error do |exception|
      process_exception(exception)
    end

    @subscriber.start
  end

  def process_notification(received_message)
    data = received_message.message.data
    published_at = received_message.message.published_at
    attributes = received_message.message.attributes

    puts "Data: #{data}, published at #{published_at}, Attr: #{attributes}"
    received_message.acknowledge!

    parsed_data = JSON.parse(data)
    file_name = parsed_data['name']
    return unless SUPPORTED_FILE_TYPES.include?(file_name)

    file = @bucket.file file_name
    process_notification = ProcessNotification.new(file, attributes, @blackbox_exporter)
    process_notification.call
  end

  def process_exception(exception)
    puts "Exception: #{exception.class} #{exception.message}"
  end

  def shutdown
    @subscriber.stop!(10)
  end

  def create_notification_config
    topic = @pubsub.topic TOPIC

    notification_exists = @bucket.notifications.count == 1
    unless notification_exists
      @bucket.notifications.each do |notification|
        notification.delete
      end
    end

    @bucket.create_notification topic.name

  rescue StandardError => e
    raise NotificationConfigError, e.message
  end
end

class BlackboxWrapper
  def initialize
    @blackbox_exporter = BlackBoxExporter.new
    @subscriber = Subscriber.new(@blackbox_exporter)
  end

  def start
    @blackbox_exporter.start
    @subscriber.listen

    at_exit do
      @blackbox_exporter.shutdown
      @subscriber.shutdown
    end

    # Block, letting processing threads continue in the background
    sleep
  end
end

blackbox_wrapper = BlackboxWrapper.new
blackbox_wrapper.start

Mặc dù phần trên là rất nhiều cách viết mã, nhưng chúng ta hãy cố gắng chia nhỏ nó bắt đầu từ phần dưới cùng:

  • BlackboxWrapper :Lớp này là điểm vào của dịch vụ của chúng tôi. - .start phương pháp thực hiện như sau:
    • Khởi động blackbox_exporter nhị phân trong một quy trình khác để bắt đầu thăm dò các điểm cuối.
    • Bắt đầu subscriber trong một quy trình khác để lắng nghe những thay đổi của nhóm.
    • Sau đó, nó gọi sleep trong quy trình chính để đảm bảo ứng dụng chạy vô hạn.
  • Làm thế nào để BlackboxExporter làm việc?
    • .start phương thức sử dụng exec phương thức hạt nhân để chạy blackbox_exporter nhị phân trong một quy trình khác.
    • .reload phương thức gửi SIGHUP tín hiệu để tải lại trực tiếp blackbox_exporter nhị phân với cấu hình mới. Như bạn có thể đã lưu ý từ ProcessNotification lớp, tệp cấu hình mới được ghi vào vị trí tệp cấu hình trước khi tải lại trình xuất.
  • Làm thế nào để Subscriber làm việc?
    • .listen bắt đầu bằng cách tạo NotificationConfiguation . A NotificationConfiguration là một quy tắc chỉ định ba điều:
      • Một chủ đề trong pub / sub để nhận thông báo.
      • Sự kiện kích hoạt thông báo được gửi. Nhấp vào đây để xem các loại sự kiện khác nhau có thể kích hoạt thông báo.
      • Thông tin có trong thông báo.
    • #create_notification_config phương pháp này cũng đảm bảo rằng chỉ có một NotificationConfiguration; nếu không, nó sẽ xóa mọi thứ và tạo một. Điều này đảm bảo rằng thông báo được gửi chỉ một lần.
    • .listen method cũng gọi @subscription.listen để bắt đầu lắng nghe các thay đổi thông báo trong nhóm mà chúng tôi đã đăng ký. Lưu ý rằng điều này sẽ chạy vô hạn trong một quy trình khác, như đã giải thích.
    • #process_notification phương thức được gọi cho mỗi bản cập nhật thông báo được gửi. Lưu ý rằng chúng tôi có SUPPORTED_FILE_TYPES , chúng tôi sử dụng để xác định các tệp trong nhóm mà chúng tôi quan tâm và không làm gì với phần còn lại.
  • ProcessNotification :Chức năng này chịu trách nhiệm xử lý thông báo, tải xuống cấu hình đã cập nhật, ghi nó vào tệp và tải lại blackbox_exporter nhị phân.

Chạy Dịch vụ cục bộ

Để chạy dịch vụ cục bộ và kiểm tra nó, hãy chạy phần sau trong thư mục gốc của thư mục ứng dụng:

export BUCKET_NAME='{insert-bucket-name}'
export PUBSUB_TOPIC='{insert-pubsub-topic}'
export TOPIC_SUBSCRIPTION='{insert-subscription-name}'
export GOOGLE_APPLICATION_CREDENTIALS='{insert-path-to-service-key-json}'

bundle exec ruby app.rb

Triển khai Dịch vụ của chúng tôi cho Google Compute Engine

Giống như nhiều khía cạnh của đám mây, có nhiều cách để đạt được cùng một kết quả, nhưng kỹ thuật phần mềm hiện đại khuyến khích các quy trình CI / CD vì một số lý do chính đáng. Do đó, chúng tôi sẽ tập trung vào việc triển khai dịch vụ của mình từ Github Actions bằng cách sử dụng setup-gcloud

Hãy thiết lập tệp triển khai của chúng tôi (.github / workflows / deploy.yml).

name: Build and Deploy to Google Compute Engine

on:
  push:
    branches:
    - main

env:
  PROJECT_ID: ${{ secrets.GCE_PROJECT }}
  GCE_INSTANCE: ${{ secrets.GCE_INSTANCE }}
  GCE_INSTANCE_ZONE: us-central1-a
  BUCKET_NAME: demo-configurations
  PUBSUB_TOPIC: demo-configurations-bucket-notifications
  TOPIC_SUBSCRIPTION: demo-bucket-changes-subscription

jobs:
  setup-build-publish-deploy:
    name: Setup, Build, Publish, and Deploy
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    # Setup gcloud CLI
    - uses: google-github-actions/setup-gcloud@master
      with:
        version: '290.0.1'
        service_account_key: ${{ secrets.GCE_SA_KEY }}
        project_id: ${{ secrets.GCE_PROJECT }}

    # Configure Docker to use the gcloud command-line tool as a credential
    # helper for authentication
    - run: |-
        gcloud --quiet auth configure-docker

    # Build the Docker image
    - name: Build
      run: |-
        docker build --tag "gcr.io/$PROJECT_ID/$GCE_INSTANCE-image:$GITHUB_SHA" .

    # Push the Docker image to Google Container Registry
    - name: Publish
      run: |-
        docker push "gcr.io/$PROJECT_ID/$GCE_INSTANCE-image:$GITHUB_SHA"

    - name: Deploy
      run: |-
        gcloud compute instances update-container "$GCE_INSTANCE" \
          --zone "$GCE_INSTANCE_ZONE" \
          --container-image "gcr.io/$PROJECT_ID/$GCE_INSTANCE-image:$GITHUB_SHA" \
          --container-env "BUCKET_NAME=$BUCKET_NAME,PUBSUB_TOPIC=$PUBSUB_TOPIC,TOPIC_SUBSCRIPTION=$TOPIC_SUBSCRIPTION"

Lưu ý rằng --container-env cờ được đặt trong giai đoạn triển khai, điều này đảm bảo rằng chúng tôi chuyển các biến môi trường cần thiết từ các bí mật của Hành động Github vào vùng chứa theo cách an toàn.

Bí mật &Biến môi trường

Tiếp theo, chúng tôi sẽ thiết lập bí mật cho các hành động trên github.

Xây dựng hệ thống giám sát thời gian hoạt động trong Ruby với GCE, Cloud Storage và PubSub

Chúng tôi đặt các biến môi trường cho vùng chứa của mình bằng --container-env lá cờ. Vì chúng tôi đang đặt nó từ các hành động trên Github, chúng tôi có thể sử dụng bí mật cho dữ liệu nhạy cảm hoặc biến env cho dữ liệu không nhạy cảm.

Tạo tài nguyên GCP

Hãy tạo một nhóm trong bảng điều khiển GCP.

Xây dựng hệ thống giám sát thời gian hoạt động trong Ruby với GCE, Cloud Storage và PubSub

Chúng tôi cũng sẽ tạo một chủ đề PubSub trong bảng điều khiển GCP.

Xây dựng hệ thống giám sát thời gian hoạt động trong Ruby với GCE, Cloud Storage và PubSub

Đặt tác nhân dịch vụ của nhóm lưu trữ đám mây - vai trò IAM - pubsub.publisher trong bảng điều khiển. Mỗi dự án có một tài khoản dịch vụ Cloud Storage được liên kết chịu trách nhiệm về một số hành động nền, chẳng hạn như thông báo PubSub. Nhấp vào đây để biết cách tìm nó.

Xây dựng hệ thống giám sát thời gian hoạt động trong Ruby với GCE, Cloud Storage và PubSub

Cuối cùng, chúng tôi tạo một đăng ký trong Bảng điều khiển GCP.

Xây dựng hệ thống giám sát thời gian hoạt động trong Ruby với GCE, Cloud Storage và PubSub

Thì đấy! 🎉 Chức năng đám mây của chúng tôi đã được triển khai thành công.

Kết luận

Nếu bạn đã làm được điều đó đến nay, bạn xứng đáng nhận được một cái bánh quy 🍪. Tôi nghĩ rằng đây là phiên bản đầu tiên của một giải pháp tuyệt vời có khả năng đạt được nhiều tối ưu hóa. Ví dụ, chúng tôi có thể đạt được những điều sau:

  • Triển khai blackbox_exporter dưới dạng một chức năng không có máy chủ để hỗ trợ nhiều khu vực, điều này lý tưởng cho việc giám sát thời gian hoạt động và triển khai một máy chủ chính chịu trách nhiệm cập nhật cấu hình nhóm trong Lưu trữ đám mây.
  • Về khả năng, từ điểm trước, chúng tôi có thể tóm tắt ứng dụng này thành một ứng dụng tích hợp vào các nhà cung cấp đám mây phổ biến để đạt được chức năng tương tự, do đó làm cho nó trở thành đám mây bất khả tri. Tái bút:Các nhà cung cấp đám mây phổ biến (GCP, AWS và Azure) cung cấp các chức năng giống nhau trên các dịch vụ.
  • Trong bài viết tiếp theo, chúng tôi sẽ xây dựng trên giải pháp này để cung cấp tính năng khôi phục với phiên bản đối tượng lưu trữ đám mây, điều này sẽ cho phép chúng tôi khôi phục sau khi cập nhật cấu hình với các bản cập nhật không chính xác.

  • Triển khai với Docker chỉ đơn giản là giải quyết vấn đề đóng gói cho chúng tôi, nhưng như bạn có thể đã biết, có nhiều cách khác nhau để đóng gói dịch vụ. Tôi chọn Docker trong bài viết này vì đơn giản.

Bảng chú giải thuật ngữ

  • Prometheus là một bộ công cụ giám sát và cảnh báo hệ thống mã nguồn mở. Nó bao gồm một máy chủ quét và lưu trữ dữ liệu chuỗi thời gian, thư viện ứng dụng khách để sửa mã ứng dụng và một trình quản lý cảnh báo để xử lý các cảnh báo.
  • Grafana là một hệ thống trực quan hóa cho phép bạn truy vấn, trực quan hóa, cảnh báo và hiểu các chỉ số của mình, bất kể chúng được lưu trữ ở đâu.
  • Trình xuất Hộp đen là một công cụ mã nguồn mở do nhóm Prometheus xây dựng để thăm dò các điểm cuối qua HTTP, HTTPS, DNS, TCP và ICMP.