すべてのプロダクト
Search
ドキュメントセンター

:Aliyun Log Go Producerを使用してSimple Log Serviceにログを書き込む

最終更新日:Nov 14, 2024

FlinkSparkStormなどのビッグデータコンピューティングエンジンを使用するときに、ログを圧縮して圧縮ログをSimple Log Serviceにアップロードしてネットワーク伝送リソースの使用量を減らす場合、Simple Log Service APIとSimple Log Service SDKは推奨されません。 この場合、Aliyun Log Go Producerを使用して、ログをSimple Log Serviceに効率的にアップロードできます。

前提条件

  • RAM (Resource Access Management) ユーザーが作成され、必要な権限がRAMユーザーに付与されます。 詳細については、「RAMユーザーの作成とRAMユーザーへの権限付与」をご参照ください。

  • ALIBABA_CLOUD_ACCESS_KEY_IDおよびALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数が設定されています。 詳細については、「Linux、macOS、およびWindowsでの環境変数の設定」をご参照ください。

    重要
    • Alibaba CloudアカウントのAccessKeyペアには、すべてのAPI操作に対する権限があります。 RAMユーザーのAccessKeyペアを使用して、API操作を呼び出したり、ルーチンのO&Mを実行したりすることを推奨します。

    • プロジェクトコードにAccessKey IDまたはAccessKey secretを保存しないことを推奨します。 そうしないと、AccessKeyペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。

  • Simple Log Service SDK for Goがインストールされています。 詳細については、「Simple Log Service SDK For Goのインストール」をご参照ください。

  • proto依存関係がインストールされています。 proto依存関係をインストールするには、go get -u github.com/gogo/protobuf/protoコマンドを実行します。

使用上の注意

この例では、中国 (杭州) リージョンのパブリックSimple Log Serviceエンドポイントが使用されています。これはcn-hangzhou.log.aliyuncs.comです。

プロジェクトと同じリージョンにある他のAlibaba Cloudサービスを使用してSimple Log Serviceにアクセスする場合は、内部のSimple Log Serviceエンドポイント (cn-hangzhou-intranet.log.aliyuncs.com) を使用できます。

Simple Log Serviceでサポートされているエンドポイントとリージョン間のマッピングの詳細については、「エンドポイント」をご参照ください。

Aliyun Log Goプロデューサーの紹介

Aliyun Log Go Producerは、ビッグデータと高同時実行シナリオで実行されるGoアプリケーション用に提供される高性能クラスライブラリです。 Simple Log Service APIおよびSimple Log Service SDKと比較して、Aliyun Log Go Producerは、高性能、コンピューティングとI/O間のロジック分離、リソース管理など、ログ書き込みに関連する複数の利点を提供します。 Aliyun Log Go Producerは、Simple Log Serviceが提供するシーケンシャル書き込み機能を使用して、ログのアップロード順序を確保します。

次の図は、Aliyun Log Go Producerのワークフローを示しています。

image

制限事項

  • Aliyun Log Go Producerの基盤となるメカニズムは、PutLogs操作を呼び出してログをアップロードします。 毎回アップロードできる生ログのサイズは限られています。 詳細については、「データの読み取りと書き込み」をご参照ください。

  • プロジェクト、ログストア、シャード、マシングループなど、Simple Log Serviceの基本リソースにも制限があります。 詳細については、「基本リソース」をご参照ください。

  • コードを初めて実行するときは、Simple Log Serviceコンソールでログストアのインデックス作成機能を有効にする必要があります。 次に、ログを照会する前に約1分間待ちます。

  • Simple Log Serviceコンソールでログを照会し、返されたログのフィールドの値の長さが上限を超えた場合、フィールドの値は切り捨てられ、余分な部分は分析に使用されません。 詳細については、「インデックスの作成」をご参照ください。

1. ProducerConfigデータ構造の設定

producerConfig := producer.GetDefaultProducerConfig()
producerConfig.Endpoint = "cn-hangzhou.log.aliyuncs.com"
provider := sls.NewStaticCredentialsProvider(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"), "")
producerConfig.CredentialsProvider = provider

ProducerConfigデータ構造を使用して、送信ポリシーを設定できます。 シナリオに基づいて送信ポリシーのパラメーターを設定できます。 下表に、各パラメーターを説明します。

パラメーター

タイプ

説明

TotalSizeLnBytes

Int64

プロデューサーインスタンスがキャッシュできるログの最大サイズ。 デフォルト値: 100 MB。

MaxIoWorkerCount

Int64

プロデューサーインスタンスで同時に実行できるゴルーチンの最大数。 デフォルト: 50。 このパラメーターは、サーバーのパフォーマンスに基づいて設定できます。

MaxBlockSec

Int

sendメソッドが呼び出されても、プロデューサーインスタンスの使用可能なスペースが不足している場合の最大ブロック時間。 デフォルト値: 60秒。

指定した最大ブロック時間が経過し、プロデューサーインスタンスの使用可能なスペースがまだ不十分な場合、sendメソッドはTimeoutExceptionエラーをスローします。 このパラメーターを0に設定し、プロデューサーインスタンスの使用可能なスペースが不十分な場合、sendメソッドはすぐにTimeoutExceptionエラーをスローします。 プロデューサーインスタンスの使用可能なスペースが十分になるまで送信メソッドをブロックする場合は、このパラメーターを負の値に設定する必要があります。

MaxBatchSize

Int64

ProducerBatchコレクションにキャッシュできるログの最大サイズ。 ProducerBatchコレクション内のログのサイズがこのパラメーターの値以上の場合、ログはSimple Log Serviceに配信されます。 デフォルト値: 512 KB。 最大値: 5 MB。

MaxBatchCount

Int

ProducerBatchコレクションにキャッシュできるログの最大数。 ProducerBatchコレクション内のログ数がこのパラメーターの値以上の場合、ログはSimple Log Serviceに配信されます。 デフォルト値: 4096 最大値: 40960。

リンゲルム

Int64

ProducerBatchコレクションが作成されてからProducerBatchコレクション内のログがSimple Log Serviceに配信されるまでの期間。 デフォルト値: 2秒。 最小値: 100ミリ秒。

リトライ

Int

初回送信失敗後にProducerBatchコレクション内のログをSimple Log Serviceに再配信できる回数。 デフォルト値は 10 です。

このパラメーターの値が0以下の場合、ProducerBatchコレクション内のログは、初回送信失敗後に失敗したキューに入ります。

MaxReservedAttempts

Int

返される試行の最大数。 ProducerBatchコレクションのログを配信しようとした回数が記録されます。 デフォルトでは、最新の11回の試行のみが返されます。

値が大きいほど、詳細をトレースできます。 ただし、より多くのメモリリソースが消費されます。

BaseRetryBackoffMs

Int64

最初の再試行のバックオフ時間。 デフォルト値: 100ミリ秒。 プロデューサインスタンスは、指数バックオフアルゴリズムを使用する。 N番目の再試行のバックオフ時間は、以下の式に基づいて計算される。BaseRetryBackoffMsパラメータの値 × 2 ^(N − 1) 。

MaxRetryBackoffMs

Int64

再試行の最大バックオフ時間。 デフォルト値: 50秒。

AdjustShardHash

Bool

sendメソッドを呼び出すときにshardHashパラメーターを設定する場合、shardHashパラメーターを変更するかどうかを指定します。 デフォルト値:true

バケット

Int

データがグループ化されるバケットの数。 このパラメーターは、AdjustShardHashパラメーターをtrueに設定した場合にのみ有効になります。 このパラメーターが有効になると、プロデューサーインスタンスはshardHashパラメーターの値に基づいてデータをバケットに自動的にグループ化します。

2つのデータエントリのshardHashパラメーターの値が異なる場合、データエントリを同じバケットにグループ化してデータアップロードすることはできません。 これにより、プロデューサーインスタンスのスループットが低下します。 プロデューサーインスタンスがデータをグループ化した後、システムはグループ化されたデータを一括でSimple Log Serviceにアップロードする可能性が高くなります。 有効な値: [1, 256] 。 このパラメーターの値は、2の整数乗である必要があります。 デフォルト値: 64。

CredentialsProvider

インターフェイス

AccessKey ID、AccessKey secret、およびSecurity Token Service (STS) トークンを動的に取得するために呼び出すことができるインターフェイス。 このパラメーターは、ビジネス要件に基づいて設定できます。 このインターフェイスは、返されたAccessKeyペアをキャッシュし、スレッドセキュリティを確保することが期待されます。

NoRetryStatusCodeList

[ ]int

再試行を必要としないリクエストに対して返されるエラーコード。 ログがSimple log Serviceにアップロードされず、リクエストに対して指定されたエラーコードが返された場合、リクエストは再試行されません。 デフォルト値: 400と404。

UpdateStsToken

Func

Aliyun Log Go ProducerがSTSトークンを自動的に更新し、トークンをプロデューサーインスタンスに追加できるようにする関数です。

StsTokenShutDown

チャンネル

STSトークンの自動更新を無効にできる通信チャネル。 通信チャネルを無効にした場合、STSトークンは自動的に更新されません。 プロデューサーインスタンスがシャットダウンされ、このパラメーターの値がnilでない場合、プロデューサーインスタンスはcloseメソッドを呼び出して通信チャネルを無効にします。 このようにして、自動更新は無効になります。

リージョン

String

Simple Log Serviceがデプロイされているリージョン。 このパラメーターは、AuthVersionパラメーターをAuthV4に設定した場合に必要です。 例:cn-hangzhou。

AuthVersion

String

署名のバージョン。 有効な値: AuthV1およびAuthV4。 AuthV4署名の例の詳細については、「producer_test.go」をご参照ください。

UseMetricStoreURL

bool

使用するMetricstoreのURL。 URLを使用して、Simple Log Serviceにログを配信できます。 これにより、大量の時系列が存在するシナリオでのクエリのパフォーマンスが向上します。

2. プロデューサーインスタンスの開始

producerInstance.Start() 関数を呼び出すと、ゴルーチンが起動して、プロデューサーインスタンスにログが書き込まれているかどうか、および送信条件に一致するロググループが存在するかどうかを監視します。 はいの場合、指定したSimple log Service Logstoreに一致したロググループを配信します。

producerInstance := producer.InitProducer(producerConfig)
ch := make(chan os.Signal)
signal.Notify(ch, os.Kill, os.Interrupt)
producerInstance.Start()

3. sendメソッドを呼び出してSimple Log Serviceにログを配信する

この例では、HashSendLogListWithCallBackメソッドを呼び出してログを配信します。 次の表で、関連パラメーターについて説明します。

パラメーター

必要

説明

project

必須

プロジェクト。

logStore

必須

Logstore。

shardHash

選択可能

配信するログのハッシュ値。 ビジネス要件に基づいてハッシュ値を指定できます。 ハッシュ値を指定すると、ログはハッシュ値に基づいて指定されたLogstore内の特定のシャードに書き込まれます。

説明

このパラメーターを設定しない場合、ログは指定されたLogstoreのシャードにランダムに書き込まれます。

topic

選択可能

ログのトピック。

説明

このパラメーターを設定しないと、二重引用符 ("") が自動的に使用されます。

source

選択可能

ログのソース。

説明

このパラメーターを設定しない場合、プロデューサーインスタンスが存在するホストのIPアドレスが自動的に使用されます。

ログ

必須

Logstoreに配信するログ。

callback

選択可能

コールバック関数。 この関数は、ログがSimple Log Serviceに配信されたとき、または複数回の再試行後にログが配信されず破棄されたときに呼び出されます。

説明

producer.GenerateLog() メソッドを呼び出して、Logstoreに配信されるログを簡単な方法で作成できます。 しかしながら、生成プロセスは非効率的である。 sls.Log操作を呼び出してログを作成することを推奨します。 例:

	var m sync.WaitGroup
	callBack := &Callback{}
	logs := []*sls.Log{}
	content := []*sls.LogContent{}
	for colIdx := 0; colIdx < 10; colIdx++ {
		if colIdx/2 == 0 {
			content = append(content, &sls.LogContent{
				Key:   tea.String("request_method"),
				Value: tea.String("GET"),
			}, &sls.LogContent{
				Key:   tea.String("status"),
				Value: tea.String("200"),
			})
		} else if colIdx/3 == 0 {
			content = append(content, &sls.LogContent{
				Key:   tea.String("request_method"),
				Value: tea.String("POST"),
			}, &sls.LogContent{
				Key:   tea.String("status"),
				Value: tea.String("500"),
			})
		} else {
			content = append(content, &sls.LogContent{
				Key:   tea.String("request_method"),
				Value: tea.String("POST"),
			}, &sls.LogContent{
				Key:   tea.String("status"),
				Value: tea.String("200"),
			})
		}
	}
	log := &sls.Log{
		Time:     proto.Uint32(uint32(time.Now().Unix())),
		Contents: content,
	}
	logs = append(logs, log)
	shardHash := ""
	for i := 0; i < 10; i++ {
		m.Add(1)
		go func() {
			defer m.Done()
			for i := 0; i < 1000; i++ {
				// GenerateLog  is producer's function for generating SLS format logs
				// GenerateLog has low performance, and native Log interface is the best choice for high performance.
				err := producerInstance.HashSendLogListWithCallBack("gs-log-test", "gstest", shardHash, "topic", "127.0.X.1", logs, callBack)
				if err != nil {
					fmt.Println(err)
				}
			}
		}()
	}
	fmt.Println("Send completion")

4。 プロデューサーインスタンスをシャットダウンする

制限シャットダウンと安全シャットダウンの2つのシャットダウンモードがサポートされています。

  • 安全なシャットダウン: このモードでは、プロデューサーインスタンスのすべてのキャッシュデータがSimple Log Serviceに配信された後、プロデューサーインスタンスがシャットダウンされます。

  • 制限付きシャットダウン: このモードでは、プロデューサーインスタンスは秒単位で指定されたパラメーター値を受け取ります。 プロデューサーインスタンスがパラメーター値を受信すると、カウントダウンが開始されます。 指定された値に達し、プロデューサーインスタンスが完全にシャットダウンされていない場合、プロデューサーインスタンスは強制終了されます。 この場合、一部のデータは配信されずに失われる可能性があります。

producerInstance.Close(60) // The limited shutdown. You must specify a positive integer for this parameter. Unit: seconds.
producerInstance.SafeClose()// The safe shutdown.

関連ドキュメント

  • API操作を呼び出した後、Simple Log Serviceによって返された応答にエラー情報が含まれている場合、呼び出しは失敗します。 関連するAPI操作のエラーコードの説明に基づいて、エラーを修正できます。 詳細については、エラーコードをご参照ください。

  • サンプルコードの詳細については、「Aliyun Log Go Producer on Github」をご参照ください。