2017-05-11 4 views
0

私は、AWS S3クライアントが正しいクライアント数を要求していることを確認するためのテストを作成したいと考えています。AWS SDK for JavaのHTTPリクエスト数をカウントするには?

class Wrapper { 
    // 
    private void buildClient() { 
     this.client = AmazonS3ClientBuilder.standard() 
       .withCredentials(this.secret) 
       .withRegion(this.region 
       .build(); 
    } 

    public void doSomething() { 
     while(checkSomething()) { 
      client.doSomething(); 
      client.doSomething(); 
     } 
    } 
} 

私はこのようなことをしたい。

class WrapperTest { 
    public testDoSomething() { 
     wrapper.doSomething(); 
     assertTrue(numberOfHttpRequest, 3); 
    } 
} 

テスト目的のために私は常にクライアントオブジェクトを模擬することができますが、また、私はまた、HTTPリクエストの数を集めるなどとして有用であるかもしれないバイトの数を収集(パフォーマンスのプロファイリングのための生産、使用中の統計情報を保存すると思っています自分自身)。

これまでのところ、Javaのドキュメントを読むと、1)ProgressEvents,2)Logging,3)AWSRequestMetricsです。しかし、どのリクエストがリクエストの数を集めるのに適しているのか、プログラムでどのように設定するのかはわかりません。

答えて

0

のユニットテストでは、MockitoまたはscalamockまたはMocking APIを使用してください。メトリクス要求の数について、

1)について

は私がログを収集し、あなたが特定のフィールドに基づいて集計できる場所)かなり一般的thesedaysである(elasticsearchに送信をお勧めします。その簡単に照会するので、以下のようsrc/main/resource/log4j.properties

log4j.rootLogger=INFO, file, consoleLogs 

# Direct log messages to a log file 
log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=myapp.log 
log4j.appender.file.MaxFileSize=10MB 
log4j.appender.file.MaxBackupIndex=10 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 

log4j.appender.consoleLogs=org.apache.log4j.ConsoleAppender 
log4j.appender.consoleLogs.layout=org.apache.log4j.PatternLayout 
log4j.appender.consoleLogs.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 
log4j.logger.com.amazonaws.request=DEBUG 

AWS SDK用のlog4jログは、以下のように見えるのエラーREPONSEについては

2017-06-01 11:56:58 DEBUG request:1137 - Sending Request: PUT https://samsa-repo.s3.amazonaws.com /sendme.log Headers: (User-Agent: aws-sdk-java/1.11.109 Mac_OS_X/10.11.6 Java_HotSpot(TM)_64-Bit_Server_VM/25.111-b14/1.8.0_111 scala/2.11.8, amz-sdk-invocation-id: 9179e5c2-fee3-4e6e-abb9-b50f882f1966, Content-Length: 9, x-amz-storage-class: REDUCED_REDUNDANCY, Content-MD5: /UERdk1lrFHXgNJHTSd3QA==, Content-Type: application/octet-stream,) 

2017-06-01 11:56:58 DEBUG request:87 - Received successful response: 200, AWS Request ID: 3695D599CB1FD794 

2017-06-01 13:58:24 DEBUG request:1572 - Received error response: com.amazonaws.services.s3.model.AmazonS3Exception: The Content-MD5 you specified did not match what we received. (Service: Amazon S3; Status Code: 400; Error Code: BadDigest; Request ID: 684584BD135900F3), S3 Extended Request ID: Y1NowPaA/mhydTWaDBupS7o7CA/PkliiVKzmDrDQwENIOdrg049h8BZ+I6Pi1GC8TZqBq1AJGJg= 

JSON形式でログすると、次のMaven依存関係を使用してJS内のlog4jログを変換できますフォーマットに、

<dependency> 
    <groupId>net.logstash.log4j</groupId> 
    <artifactId>jsonevent-layout</artifactId> 
    <version>1.7</version> 
</dependency> 

その後、

{ 
    "@timestamp": "2017-06-01T21:05:37.204Z", 
    "source_host": "M00974000.prayagupd.net", 
    "file": "AmazonHttpClient.java", 
    "method": "executeOneRequest", 
    "level": "DEBUG", 
    "line_number": "1137", 
    "thread_name": "ScalaTest-run-running-PublishToSimpleStorageServiceSpecs", 
    "@version": 1, 
    "logger_name": "com.amazonaws.request", 
    "message": "Sending Request: HEAD https://samsa-repo.s3.amazonaws.com/Headers: (User-Agent: aws-sdk-java/1.11.109 Mac_OS_X/10.11.6 Java_HotSpot(TM)_64-Bit_Server_VM/25.111-b14/1.8.0_111 scala/2.11.8, amz-sdk-invocation-id: 39fd8121-b40d-cb48-a6ea-65cf580f569f, Content-Type: application/octet-stream,) ", 
    "class": "com.amazonaws.http.AmazonHttpClient$RequestExecutor", 
    "mdc": {} 
    }, 
    { 
    "@timestamp": "2017-06-01T21:05:38.337Z", 
    "source_host": "M00974000.prayagupd.net", 
    "file": "AwsResponseHandlerAdapter.java", 
    "method": "handle", 
    "level": "DEBUG", 
    "line_number": "87", 
    "thread_name": "ScalaTest-run-running-PublishToSimpleStorageServiceSpecs", 
    "@version": 1, 
    "logger_name": "com.amazonaws.request", 
    "message": "Received successful response: 200, AWS Request ID: null", 
    "class": "com.amazonaws.http.response.AwsResponseHandlerAdapter", 
    "mdc": {} 
    } 

あなたはログを送信した後

は次のようにフォワーダを使用してelasticsearchし、

log4j.rootLogger=INFO, file, consoleLogs 

# Direct log messages to a log file 
log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=myapp.log 
log4j.appender.file.MaxFileSize=10MB 
log4j.appender.file.MaxBackupIndex=10 
log4j.appender.file.layout=net.logstash.log4j.JSONEventLayoutV1 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 

log4j.appender.consoleLogs=org.apache.log4j.ConsoleAppender 
log4j.appender.consoleLogs.layout=net.logstash.log4j.JSONEventLayoutV1 
log4j.appender.consoleLogs.layout.ConversionPattern=%d [%t] %-5p %c - %m%n 
log4j.logger.com.amazonaws.request=DEBUG 

ログは以下のようになります、net.logstash.log4j.JSONEventLayoutV1にログ・パターンを変更しますfilebeatでは、ログ/リクエストを値Sending Requestで集計/検索できます。

filebeat forwarder/elasticsearch/kibanaダッシュボードが過剰である場合は、AWS cloudwatchを介して集約ログに行きたいと思うかもしれません。

関連する問題