Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

マイクロサービスの監視:データ構造化のための名前空間の使用

マイクロサービスアーキテクチャとは何ですか?

マイクロサービスアーキテクチャは、いくつかの小さなプログラムを組み合わせてアプリケーションを作成するソフトウェアデザインパターンです。マイクロサービスと呼ばれるこれらのプログラムは、共通の目標のために連携して機能します。一部のチームでは、単一の大きなアプリケーションよりも、いくつかの小さなアプリケーションを作成する方がはるかに少ない時間と労力で済みます。

マイクロサービス指向のプロジェクトは、それぞれがその役割を果たし、別々のプロセスで実行され、標準化されたインターフェイスを介して他のアプリケーションと通信する一連の小さなアプリケーションで構成されます。このアプローチにより、チームは1つの言語やフレームワークにコミットすることなく、問題ごとに最適なツールを選択できます。また、作業をより専門的なグループに分割することもできます。

モノリスからマイクロサービスへ

このシリーズの最初の部分では、モノリスについて話しました。モノリスは簡単に始めることができます。ただし、主にすべてが非常に緊密に結合されているため、開発ペースのスケーリングは不十分です。コードを少し変更するだけでも、プロジェクト全体を再構築してテストする必要があり、リリースサイクルがイライラするほど長くなります。

モノリスからマイクロサービスに移行するにはどうすればよいですか?アマゾンを例にとってみましょう。しばらく前に、それらはモノリスとして始まり、時間の経過とともにマイクロサービスに切り替わりました。初期のデザインは次のようになっている可能性があります:

もちろん、ここでは単純化しすぎていますが、基本のほとんどをカバーしたと思います。彼らが最初からマイクロサービスのパターンに従うことを選択した場合はどうなりますか?アプリケーションを機能ごとに分割し、各コンポーネントを1つの問題に集中させることになります。

また、通常はRESTful APIなどの軽量メカニズムを使用して、サービス間通信用のインターフェースとプロトコルを定義する必要がありました。

名前空間とは

マイクロサービスの設計には、固有の一連の課題があります。主なものは、おそらくインストルメンテーションとエラー報告です。考えてみてください。私たちは、さまざまなプラットフォームや言語に分散している数十または数百のコンポーネントを監視しています。そして、私たちはどういうわけかそれらすべてに目を光らせ、同時に全体像を失わないようにしなければなりません。名前空間は、緩く結合されたマイクロサービスのグループを一貫性のある画像に集中させるのに役立ちます。

AppSignalでは、名前空間は収集されたメトリックのコンテナーです。 AppSignalはデフォルトで3つの名前空間を使用します(webbackground 、およびfrontend )ですが、数行のコードを追加することで独自のコードを作成できます。次にそれらがどのように機能するかを見ていきます。

すべてを支配する1つのアプリケーション

マイクロサービスコンポーネントをセットアップするとき、最初に行うことは、共通のアプリケーション名と環境を構成することです。したがって、AppSignalは、収集されたすべてのメトリックとアラートを同じダッシュボードに表示します。

これらの値を構成する方法の具体的な詳細は、言語と統合によって異なります。たとえば、「Nozama」という名前を使用するようにRuby on Railsアプリケーションを構成するには:

# config/appsignal.yml
production:
  active: true
  push_api_key: "YOUR APPSIGNAL API KEY"
  name: "Nozama"

これは、Elixir統合を構成する方法と非常によく似ています:

# config/config.exs
config :appsignal, :config,
  active: true,
  name: "Nozama",
  push_api_key: "YOUR APPSIGNAL API KEY",
  env: "production"

一方、Node.jsでは次を使用します:

const { Appsignal } = require("@appsignal/nodejs");
 
const appsignal = new Appsignal({
  active: true,
  name: "Nozama",
  apiKey: "YOUR APPSIGNAL API KEY",
});

フロントのJavaScript統合には、@appsignal/javascriptを使用します 代わりに:

import Appsignal from "@appsignal/javascript";
 
export default new Appsignal({
  name: "Nozama",
  key: "YOUR FRONTEND API KEY",
});

AppSignalのインストールと構成に関する情報は、次の場所にあります:

  • 新しいアプリケーションの追加
  • アプリケーションの構成

マイクロサービスでの名前空間の使用

各マイクロサービスのコーディングをどのように行うかを見てみましょう。課金システムから始めましょう。この部分ではElixirとPhoenixを使用します。

フェニックス統合のセットアップを実行したら、コントローラーの作業を開始できます。次のスニペットは、名前空間をbillingに設定します :

# in a Phoenix controller, we use plug to run the namespace initialization
defmodule BillingPageController.PageController do
  use BillingPageController, :controller
 
  plug :set_appsignal_namespace
 
  defp set_appsignal_namespace(conn, _params) do
    # Sets all actions in this controller to report in the "billing" namespace
    Appsignal.Transaction.set_namespace(:billing)
    conn
  end
 
  # rest of the controller ...
end

マイクロサービスが実行され、コントローラーが何らかのアクティビティを確認すると、データがダッシュボードに表示され始めます。

もちろん、人々が何かを買わない限り、請求は私たちを遠ざけることはありません。これは、別のマイクロサービスで取り組むことができる問題です。同じパターンに従って、PayButtonControllerを使用して新しいPhoenixアプリケーションを作成します。 このように始まるコントローラー:

defmodule PayButtonController.PageController do
  use PayButtonController, :controller
 
  plug :set_appsignal_namespace
 
  defp set_appsignal_namespace(conn, _params) do
    Appsignal.Span.set_namespace(Appsignal.Tracer.root_span(), "pay_button")
    conn
  end
 
  # rest of the controller ...
 
end

これで、ダッシュボードに2つの名前空間ができました。同じ名前と環境を使用すると、PayButtonControllerからのデータが保証されます BillingPageControllerと一緒に表示されます 、異なるマシンで実行されている別々のアプリケーションであっても。

次のコンポーネントはレコメンデーションエンジンです。 Expressで製品の提案を表示するAPIエンドポイントを実装します。次に示すように、Node.jsで名前空間を設定します。

app.get("/", (req, res) => {
  const tracer = appsignal.tracer();
  tracer.withSpan(
    tracer.createSpan({ namespace: "recommendations" }),
    (span) => {
      // code to measure goes here
 
      span.close();
    }
  );
});

現在、最大3つの名前空間があります。

モバイルチームとフロントエンドチームは、ダッシュボードにエラーを記録したい場合があります。 AppSignalのJavaScript統合により、受信データがfrontendに自動的に割り当てられます。 名前空間。ただし、次のように変更できます:

try {
  // code that might fail
} catch (error) {
  // handle the error
 
  // send error to AppSignal
  appsignal.sendError(error, {}, "Mobile");
}

しばらくすると、データがMobileに表示されるようになります。 名前空間。

この例はプレーンなJavaScriptを示していますが、ReactやAngularなどのフロントエンドフレームワークを使用している場合は、追加のセットアップ手順が必要になる場合があります。

Webサイトでは、AppSignalがすぐに使用できるMVCフレームワークとしてよく知られているRubyonRailsを試してみましょう。次のスニペットを使用してRailsコントローラーを起動し、名前空間をhomepageに設定します。 :

# in Rails we use before_action callback to change
# the namespace before the request starts
class HomepageController < ApplicationController
    before_action :set_appsignal_namespace
 
    def set_appsignal_namespace
        Appsignal.set_namespace("homepage")
    end
 
    # controller actions ...
end

次に、APIエンドポイントを使用して、Webサイトとモバイルアプリケーションにデータを提供できます。このために、Ruby用の軽量RESTAPIフレームワークであるGrapeを使用できます。今回は、AppSignalの構成にもう少し手間がかかります。

以前に行ったように、「config / appsignal.yml」でRuby統合を構成した後、次のコマンドでイベントとメトリックのログ記録を開始できます。

Appsignal.start_logger
Appsignal.start

次に、AppSignalミドルウェアをエラーハンドラチェーンに挿入します。

require "appsignal"
require "appsignal/integrations/grape"
 
class API < Grape::API
    insert_before Grape::Middleware::Error, Appsignal::Grape::Middleware
 
 
    resource :search do
      desc 'return a product search'
 
      before do
        Appsignal.set_namespace("search")
      end
 
      get :product do
 
        # product search logic
 
      end
  end
end

その他の例については、Grape統合ドキュメントを確認してください。

写真を完成させるために、Sidekiqのバックグラウンドジョブで終了します。 SidekiqはRubyで人気のあるジョブプロセッサであり、これが「config / appsignal.yml」を構成した後、スタンドアロンモードで起動する方法です。

# config.ru
require 'appsignal'
 
Sidekiq.on(:startup) do
  Appsignal.start
end
 
Sidekiq.on(:shutdown) do
  Appsignal.stop('Sidekiq shutdown')
end

AppSignalは、ジョブからのデータをbackgroundに自動的に割り当てます。 名前空間。より具体的な名前空間に変更したい場合があります。

require 'sidekiq'
require 'appsignal'
 
 
class PlainOldRuby
  include Sidekiq::Worker
 
  def perform()
    Appsignal.set_namespace("urgent_background")
 
    # job logic
 
  end
end

スタンドアロンエージェントを使用したメトリックの収集

スタンドアロンエージェントは、Ubuntu、RedHat、またはCentOSマシンからリソース使用率メト​​リックを収集します。エージェントを使用して、データベース、ゲートウェイ、メッセージブローカーなどの機能をマイクロサービスアプリケーションに提供する衛星サーバーを監視できます。

AppSignalでは、エージェントを使用して独自のKafkaサーバーを監視します。このエージェントは、直接サポートされていない言語やフレームワークでカスタムインストルメンテーションを作成する場合にも便利です。

エージェントの使用を開始するには、インストール手順に従ってエージェントをダウンロードしてインストールします。

実行したら、構成ファイルを編集して、APIキー、アプリケーション名、および環境を設定する必要があります。マイクロサービスの残りの部分で使用されているのと同じ値を使用して、すべてを1つのダッシュボードにまとめます。

# /etc/appsignal-agent.conf

push_api_key = "YOUR APPSIGNAL API KEY"
app_name = "Nozama"
environment = "production"

結論

名前空間は、複数のシステムに分散されたデータを整理するための優れた方法です。また、通知を構成したり、アラート処理を微調整したりすることもできます。それがどのように機能するかを確認するには、このシリーズの最初の部分を確認してください。

追加の読み取り:

  • 名前空間で何ができますか?
  • StatsDとAppSignalのスタンドアロンエージェントを使用してシステムを監視する
  • ホストの指標とアラートの改善

  1. Python-Bokehを使用したデータの視覚化

    Bokehは、Webブラウザ用のPythonデータ視覚化ライブラリです。用途の広いグラフィックのエレガントで簡潔な構造を作成します。インタラクティブなプロット、ダッシュボード、およびデータアプリケーションをすばやく簡単に作成するために使用されます。この記事では、Bokehを使用してさまざまなタイプの基本的なグラフを作成する方法を説明します。 線のプロット 折れ線グラフは、その中の点のx座標とy座標を2つのリストとして使用して作成できます。図の高さと幅を指定することにより、ブラウザに出力を直接表示します。線の幅や線の色などの追加のパラメータを指定することもできます。 例 from bokeh.

  2. Ruby開発者向けのデータ構造の概要

    データ構造とは何ですか? データ構造は、データを整理してアクセスするための特定の方法です。 。 例: 配列 二分木 ハッシュ さまざまなデータ構造がさまざまなタスクに優れています。 たとえば、辞書(単語と定義)や電話帳(人の名前と番号)のようなデータを保存する場合は、ハッシュが最適です。 利用可能なデータ構造を知る 、およびそれぞれの特徴 、より優れたRuby開発者になります。 それがこの記事で学ぶことです! 配列について 配列は、プログラミングについて読み始めたときに最初に学習するデータ構造です。 配列は、オブジェクトがギャップなしで次々に格納される連続したメモリのチャン