ã¯ããã«...
ç£æ¥éçºã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«æ©èœãããã«ã€ããŠã®ç¥èãå¿ èŠã§ãããã®è«æã¯å ¬çãšããŠãšãããã¹ãã§ãããã®ç¥èã¯ãã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠçæãããã¡ããªãã¯ã§ããã¡ããªãã¯ã¯ãçŽç²ã«æè¡çïŒããšãã°ãæ¶è²»ãããRAMã®éïŒãŸãã¯ããžãã¹ïŒããšãã°ãå®äºããæ³šæïŒã®ããããã§ãã
ã¡ããªãã¯ã®ã«ããèªäœã¯ãçŸæç¹ã§ã¯å¿ ãããè峿·±ãã瀺åçã§ãããšã¯éããŸããããããã®ã¡ããªãã¯ã®åéãä¿åãããã³è¡šç€ºã«ã€ããŠãåºæ¬çãªè³ªåãçºçããŸãã
ã¡ããªãã¯ã®å¿ èŠæ§ãšãã®åŠçæ¹æ³ã®ç¶æ³ã¯ããµãŒãã¹ã¢ãããŒãã䜿çšããããŠãŒã¶ãŒã®èгç¹ãã1ã€ã®ã¢ããªã±ãŒã·ã§ã³ãè€æ°ã®çžäºäœçšãããµãŒãã¹ã®æäœã«ãã£ãŠãµããŒããããå Žåãããæ·±å»ã«ãªããŸããããã«ã¯ã©ãŠãå±éã远å ããåèŸåãåãåããŸãã
ã©ããªå 容ã§ãã
ç§ãåå ããŠãããããžã§ã¯ãã¯ããµãŒãã¹ã䜿çšããŠAWSïŒAmazon Web ServicesïŒã«ãããã€ããŠããã ãã§ããã»ãšãã©ã®ãµãŒãã¹ã¯ãJava 8以éãSpring Bootãããã³Dockerã䜿çšããŠæ§ç¯ãããŠããŸããLuxoft IT SredaïŒ7ã§ã®è¬æŒãšãã®èšäºã¯ããããžã§ã¯ãã®ããŒãºãšç®çããçãŸããŸããã
ç§ã®ç®æšã¯ãSpring Bootã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã¡ããªãã¯ãåéããããããAWSCloudWatchã«ãšã¯ã¹ããŒãããããšã®å®éçãªåŽé¢ã確èªããããšã§ããããã¯ãå®éã«ã¯ã説æããã¥ã¢ã³ã¹ã®åæãããã³å¯èœãªã¬ãŒããå«ãã¹ããããã€ã¹ãããã¬ã€ãã«ãªããŸãã
å®éã®åé¡ã解決ããããšã«ã€ããŠè©±ããšãããããæ¢åã®ç°å¢ãšæ¯èŒããããã«ãã®çç¶ãçè§£ããããšãéèŠã§ããç§ãã¡ã話ããŠããããšã1察1ã§é©çšããããšã¯å¯èœã§ããããããšãé©å¿ãå¿ èŠãªå Žåã¯ãããã«èª¿æ»ãè¡ãããšã¯å¯èœã§ããã
çŸåšã®ã³ã³ããã¹ããäœã§æ§æãããŠããããèŠãŠã¿ãŸãããã
- åœç¶ã®ããšãªãããç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ãŸãã¯ãµãŒãã¹ã¯SpringBootã«åºã¥ããŠããŸããMavenãã«ããŒãšããŠãJava 8+
- Dockerããã ãããã®äœ¿çšã¯éèŠã§ã¯ãããŸãããdockerã§å®è¡ãããŠããã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã¹ãŠãæ©èœããããšãéèŠã§ãã
- AWS EC2ã¯ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããã€ã³ãã©ã¹ãã©ã¯ãã£ã§ããäžæ žãšãªãã®ã¯ãAWSå ã®ä»®æ³ãã·ã³ã§ãã
- AWS CloudWatchã¯ãAWââSã€ã³ãã©ã¹ãã©ã¯ãã£ããã·ã¥ããŒãã§ããç£èŠã·ã¹ãã ã§ãã
æ¥ã®ããŒã
SpringBootãšãã®æ©èœã«ç§»ããŸããããå µåšåº«ã§æåã§æãéèŠãªã®ã¯ã¢ã¯ãã¥ãšãŒã¿ãŒã§ãããã®ã¢ãžã¥ãŒã«ã䜿çšãããšãå®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã®å éšã調ã¹ãŠããã®åäœãããçšåºŠã«ã¹ã¿ãã€ãºã§ããŸããäŸãã°ïŒ
- Health check:
- , , runtime.
- ,
- , , : , , GC.
- ...
å€ãã®Springã³ã³ããŒãã³ããšåæ§ã«ãActuatorã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã«äŒŒãŠãããã«ã¹ã¿ãã€ãºãæ¡åŒµãããã³åŸ®èª¿æŽãå¯èœã§ããããããå匷ãå§ããããšãã§ããŸãã
ã»ããå šäœã®äžã§ãçŸåšãã¡ããªãã¯ã«é¢å¿ããããŸããç¹ã«ã¢ã¯ãã¥ãšãŒã¿ãšã¡ããªã¯ã¹ã¯æ¡åŒµå¯èœã§ããã ãã§ãªããäºåã«æ§æãããŠãããããããã«äœ¿çšã§ããã¡ããªã¯ã¹ã®ã«ããŽãªã¯æ°åã«ãããŸããããã¡ãããç¬èªã®ã¡ããªãã¯ãç»é²ããããšãã§ããŸãã Webã¢ãžã¥ãŒã«ããããžã§ã¯ãã«æ¥ç¶ãããŠããå Žåã¯ãã«é£çµ¡ããŠã¡ããªãã¯ãååŸã§ããŸã
endpoint /metricsã
ã¡ããªãã¯ã®åéãšé ä¿¡ã¯ãPivotalã®è£œåã§ãããã€ã¯ãã¡ãŒã¿ãŒã©ã€ãã©ãªãä»ããŠå®è£ ãããŸãïŒçŸåšã¯VMwareã®äžéšã§ãïŒãSpringãéçºããŠããã®ãšåããã®ã§ããmicrometerã¯ãJavaã¢ããªã±ãŒã·ã§ã³ã¡ããªãã¯ããšã¯ã¹ããŒãããããã®ãã³ããŒã«äŸåããªããã¡ãµãŒããšããŠè²©å£²ãããŠããŸãã
ã¢ã¯ãã¥ãšãŒã¿ãæ¥ç¶ããã«ã¯ã次ã®ã¹ã¿ãŒã¿ãŒãå¿ èŠã§ãã
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
æ¥ã®é²
次ã«ãSpringCloudã®ã¢ãžã¥ãŒã«ãå¿ èŠ
spring-cloud-starter-awsã§ãã
Spring Cloudãã¡ããªãŒã®åã¢ãžã¥ãŒã«ã«ã¯ç¬èªã®ããŒãžã§ã³ããããã¢ãžã¥ãŒã«ã®ç¹å®ã®ããŒãžã§ã³ã§ã¯ãªããã¢ãžã¥ãŒã«
spring-cloud-dependenciesã®äºææ§ã®ããããŒãžã§ã³ãåéãããç¹å®ã®ããŒãžã§ã³ïŒãªãªãŒã¹ãã¬ã€ã³ïŒã®BOMã䜿çšããã®ãæ£ããã§ãããããããæžããŠããæç¹ã§ã¯ãããã¯Hoxton.RELEASEã§ãã
AWSãæäœããããã®ããããèªåæ§æã«å ããŠãäžæ
spring-cloud-starter-awsçãªäŸåé¢ä¿ãšããŠããæäŸãaws-java-sdkãŸãã
äŸåé¢ä¿ç®¡çã»ã¯ã·ã§ã³ã«ã
<dependencyManagement>
...
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
...
</dependencyManagement>
ãããŠã«å¿ããŠïŒ
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-aws</artifactId>
</dependency>
ãã€ã¯ãã¡ãŒã¿ãŒã¬ãžã¹ããª
ããã§ãSpringActuatorãšã«ãã€ã¯ãã¡ãŒã¿ãŒãã§ããŸãã
aws-java-sdkãç®±ããåºããŠãmicrometerã¯ããŒã¿ãAWS CloudWatchã«ãšã¯ã¹ããŒãã§ããŸãããããã«ã¯ãã¡ããªãã¯ãåéããããã®micrometeræœè±¡åã§ããMeterRegestryã®é©åãªå®è£
ãå¿
èŠã§ããããã©ã«ãã¯SimpleMeterRegistryã§ãããŒã¿ãã¡ã¢ãªã«ä¿åããŸããå¿
èŠãªå®è£
ã¯ãšäžç·ã«æ¥ç¶ããmicrometer-registry-cloudwatchãŸãããã®èšäºã®å·çæç¹ã§ã¯ãçŸåšã®ããŒãžã§ã³ã¯1.3.5ã§ãã
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-cloudwatch</artifactId>
<version>1.3.5</version>
</dependency>
ãã®å Žåãæçµçãªpom.xmlã¯æ¬¡ã®ããã«ãªããŸããgithub.com / MrArtemAA / blog-demos / blob / master / export-metrics-to-cloudwatch / pom.xml
app.properties
ã¢ããªã±ãŒã·ã§ã³ããããã£ã®èšå®ã«ç§»ããŸãããããã®å ŽåãéèŠãªåœ¹å²ãæãããŸã
ã1
management.metrics.export.cloudwatch.namespaceãïŒã¡ããªãã¯ãCloudWatchã«ä¿åãããååãæå®ããå¿
èŠããããŸãããªããªãã¡ããªãã¯èªäœã«ã¯ãããŒã¿ãã¢ããªã±ãŒã·ã§ã³ã®ã©ã®ã€ã³ã¹ã¿ã³ã¹ããååŸããããã«ã€ããŠã®æ
å ±ã¯ãããŸãããååä»ãã¯ãç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã®ã¡ããªãã¯ã決å®ããã ãã§ããããããªããšãè€æ°ã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠ1ã€ã®åå空éãå®çŸ©ãããšãã¡ããªãã¯ããŒã¿ãæ··åšããããããã©ãããæ¥ãã®ããæç¢ºã«ãªããŸããã
2
management.metrics.export.cloudwatch.batch-sizeïŒæç€ºçã«ãã®ãã©ã¡ãŒã¿ããªãæ£ç¢ºã«20ããäœ20ã«ããããµã€ãºã®ããããã£ã®å€ãèšå®ããããã«å¿
èŠã§ããïŒã¡ããªãã¯ã¯ãäžåºŠã«20ã®ãããïŒããã¯AWSã®å¶éã§ãïŒã§ãAmazonCloudWatchã¯ã©ã€ã¢ã³ãã«éåæã§éä¿¡ãããŸãã
3
cloud.aws.stack.auto=falseïŒç¡å¹ã«ããå¿
èŠãAWS CloudFormationã¹ã¿ãã¯ã®èªåæ€åºä»¥æ¥ ããã©ã«ãã¯= trueã§ãããã®ããããã£ã¯ãã¢ããªã±ãŒã·ã§ã³ãã¹ã¿ãã¯åãèªåçã«ååŸããŠãã¯ã©ãŠãç°å¢çšã«ã¢ããªã±ãŒã·ã§ã³ãæ§æããããšãããã©ãããæ±ºå®ããŸãïŒinfrastructure-as-codeãã©ãã€ã ïŒãéåžžã®ä»®æ³ãã·ã³ã®ããã«EC2ã«ãããã€ããå Žåããã®æ
å ±ã¯å©çšã§ããŸããã
AWS SDKã远å ã®æ§æãªãã§ç¬èªã«ååŸããããšãããã¹ãŠã®æ å ±ã¯ã[ã©ã€ãã©ãª]ãEC2ã¡ã¿ããŒã¿ããååŸããããšãçè§£ããããšãéèŠã§ãããã®æ å ±ãååŸããããã«ãåŒã³åºããè¡ãããç¹å¥ãªãµãŒãã¹ãšã³ããã€ã³ãããããŸãã
ãããªãŒãã£ã³ã°
ããããµã€ãº
ããããã£ã«æ»ãã
management.metrics.export.cloudwatch.batch-size20ã«èšå®ããå¿
èŠããããŸããããã¯ãã¹ãŠãAWSã§åäœãã察å¿ããã©ã€ãã©ãªã®ã¬ãã«ã§å®è¡ã§ããããã§ããå®éãå€ãæ£ãããã§ãã¯ããå€ã20ãè¶
ãããšäŸå€ãã¹ããŒããã¡ãœãããmicrometer-registry-cloudwatchåããã€ã³ã¿ãŒãã§ã€ã¹ããããŸãCloudWatchConfig defaultããã ãããèŠããšorg.springframework.cloud.aws.autoconfigure.metrics.CloudWatchExportAutoConfigurationãæ¬¡ã䜿çšããŠæ§æãè¡ãããŠããããšãããããŸããorg.springframework.cloud.aws.autoconfigure.metrics.CloudWatchPropertiesConfigAdapter:
@Bean
@ConditionalOnMissingBean
public CloudWatchConfig cloudWatchConfig(CloudWatchProperties cloudWatchProperties) {
return new CloudWatchPropertiesConfigAdapter(cloudWatchProperties);
}
ã¢ããã¿ãŒã¯ãé çªã«ãäžæžããããŸã
batchSize()ããã«
@Override
public int batchSize() {
return get(CloudWatchProperties::getBatchSize, CloudWatchConfig.super::batchSize);
}
ããã¯ã
CloudWatchPropertiesããããã£ãå®çŸ©ãããŠããå ŽåãããããååŸãããããšãæå³ããŸããå¿
èŠãªãã§ãã¯ãå«ãŸããŠããããããããã£ãæç€ºçã«èšå®ãããŠããªãå Žåãããã©ã«ãå€ã¯10000ã«ãªããŸãã
AWSãžã®ãªã¯ãšã¹ã
ã¢ããªã±ãŒã·ã§ã³ïŒãµãŒãã¹ïŒã¯ãAmazonãµãŒãã¹ã«ãªã¯ãšã¹ããéä¿¡ããã ãã§ã¯äžååã§ãããããã®[ãªã¯ãšã¹ã]ã«ã¯è³æ Œæ å ±ãå«ãŸããŠããå¿ èŠããããŸãããããè¡ãããã«ãAWSSDKã«ã¯è³æ Œãããã€ããŒãã§ãŒã³ããããŸããããããå§ãããŸãããããã®ãããã€ããŒã®äžã«ã¯ãEC2ã¡ã¿ããŒã¿ã«åºã¥ããŠããŒã¿ãåä¿¡ã§ããã€ã³ã¹ã¿ã³ã¹ãããã¡ã€ã«ããããŸãããããæ©èœãããã«ã¯ãããŒã«ãEC2ã«ãã€ã³ããããŠããããšã確èªããå¿ èŠããããŸãã
ããŒã«ã¯ãCloudWatchã«ãªã¯ãšã¹ããéä¿¡ããEC2ã§äœ¿çšã§ããããã«ããããã®ã¢ã¯ã»ã¹èš±å¯ãä»äžããå¿ èŠããããŸãããã®åœ¹å²ã¯ãæ°ããEC2ã€ã³ã¹ã¿ã³ã¹ãäœæãããšãããŸãã¯æ¢åã®ã€ã³ã¹ã¿ã³ã¹ã«ã¢ã¿ãããããšãã«æå®ã§ããŸãã圹å²ã¯ãã®å Žã§é©çšãããŸãã
ã¡ããªãã¯ã®ç¡å¹å
ããŒã«ã«ãã«ããŸãã¯ãã¹ãç°å¢ã®å Žåãã¡ããªãã¯ã®ãšã¯ã¹ããŒãã¯ããéããããããŸãããããããã£ãèšå®ãã
management.metrics.export.cloudwatch.enabled=falseãšãã¡ããªãã¯ã®åéãå®è¡ãããŠããéãCloudWatchãžã®ã¡ããªãã¯ã®ãšã¯ã¹ããŒããç¡å¹ã«ã§ããŸãããŸããWebã¢ãžã¥ãŒã«ãæ¥ç¶ãããŠããå Žåã¯ãendpoint /metricsããããåŒãç¶ã䜿çšã§ããŸãã
Micrometerã¯ãããŸããŸãªã¡ããªãã¯ãåéããŠæäŸããŸãããããã®ããã€ããäžèŠãªå Žåã¯ãç¡å¹ã«ããããšãã§ããŸããåå¥ã«ããŸãã¯ã«ããŽãªå šäœã§ç¡å¹ã«ããããšãã§ããŸãããããã£ãŠãããšãã°ãããããã£ã¯IDããã§å§ãŸããã¹ãŠã®ã¡ããªãã¯ãç¡å¹ã«ããŸããæ³šæïŒç¡å¹ã«ãããã¡ããªãã¯ã¯ãŸã£ããåéãããŸããã
management.metrics.enable.some.metric=falsesome.metric
ãã¹ãŠã®AWSãå®è¡ãã
ãã¹ãŠã®AWSã§å¿ èŠæå°éã®èšå®ã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããšãããšããã1ã€ã®é©ããåŸ ã£ãŠããŸããæäœã®ããã«ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããŠããå°åã®å¿ èŠãªããŒã¿ããã§ã«ç¥ã£ãŠããããã«ãæç€ºçã«è¿°ã¹ãããŠããªããã®ã¯äœã§ããAWSSDKã¯ã¡ã¿ããŒã¿ããååŸããããšããŸã...ããã«ã¯ãããŸããããããã£ãŠãããããã£ã䜿çšããŠç®çã®é åãæç€ºçã«ç€ºããŸã
cloud.aws.region.static=us-east-2ãã¹ã¿ãã¯ã®ååïŒproperty cloud.aws.stack.autoïŒã®å Žåãšåæ§ã«ãããã©ã«ãã§cloud.aws.region.autoçããããããã£ãããtrueãŸãããã ããå€ãfalseã«èšå®ããã ãã§ã¯ã圹ã«ç«ã¡ãŸãããå°åã®äŸ¡å€ãå¿
èŠã§ãã
ãŸããèŠããŠããããã«ãAWSãžã®ãªã¯ãšã¹ãã«ã¯è³æ Œæ å ±ãå¿ èŠãªãããã¡ããªãã¯ãCloudWatchã«è»¢éããïŒãŸãã¯AWSã«ä»ã®ãªã¯ãšã¹ããè¡ãïŒå¿ èŠãããå Žåã¯ãè³æ Œæ å ±ã®ãã©ã¡ãŒã¿ãæç€ºçã«æå®ããå¿ èŠããããŸãããšãã°ãã¢ããªã±ãŒã·ã§ã³ã®ããããã£ãç°å¢å€æ°ãä»ããŠã
ã¢ããªã±ãŒã·ã§ã³ããããã£ã®ãã¹ã¹ã«ãŒã¯æ¬¡ã®ããã«ãªããŸãã
cloud.aws.credentials.access-key=YOUR_ACCESS_KEY
cloud.aws.credentials.secret-key=YOUR_SECRET_KEY
çµæ
ãæ°ã¥ããããããŸããããã¹ããŒã å šäœãæ©èœãããã¢ããªã±ãŒã·ã§ã³ããCloudWatchã«ã¡ããªãã¯ã転éããããšã¯ãããã»ã©é£ãããããŸããã3ã€ã®äŸåé¢ä¿ãš3ã€ã®ããããã£ãå¿ èŠã§ããã
æãéèŠãªããšã¯çްéšã«ãããŸãã SpringãAWS SDKãªã©ã®ã©ã€ãã©ãªïŒãã¬ãŒã ã¯ãŒã¯ïŒã¯ãäœæ¥ã楜ã«ããå¯èœãªéããã¹ãŠã®äœæ¥ãå®è¡ããããšããŠããŸãããåæã«ãå°ãã§ãé¢ãããšãã¹ã¿ãã¯ãã¬ãŒã¹ã衚瀺ãããã¡ããªãã¯ãã©ãã«ãè¡ããªãçç±ãã¢ããªã±ãŒã·ã§ã³ããŸã£ããèµ·åããªãçç±ãçè§£ããããšããŸãããããŠãããä¿®æ£ããæ¹æ³ããã¥ã¢ã³ã¹ã®å èš³ãšEC2ããã³CloudWatchãµãŒãã¹ãã©ã®ããã«æ©èœãããã®è©³çްã®ããã€ãã®èª¬æãå«ãã»ã¯ã·ã§ã³ããäœãèµ·ãã£ãŠããã®ããçè§£ããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
CloudWatchèªäœã®äœ¿çšã«ã€ããŠè©±ãå Žåãç§ã®æèŠã§ã¯ãããã¯AWSã€ã³ãã©ã¹ãã©ã¯ãã£ã䜿çšããå Žåã®ããªãèªç¶ãªéžæã§ãã
ã¡ããªãã¯ã¯ã¢ããªã±ãŒã·ã§ã³ã®ç®ãšè³ã§ãããããã¯ãã¡ããªãã¯ãã©ã®ããã«åéãã«ãŠã³ãã衚瀺ãããããçè§£ããå¿ èŠããããšããäºå®ãåŠå®ãããã®ã§ã¯ãããŸããããã£ãŒãã«ã¯ã©ã®ãããªããŒã¿ã衚瀺ãããŸããããã®åé¡ã¯ãç°åžžãã€ã³ã·ãã³ãã®åæãçºçããå Žåã«ç¹ã«æ·±å»ã«ãªããŸãããã€ã¯ãã¡ãŒã¿ã©ã€ãã©ãªã«ã€ããŠèª¬æããå Žåã¯ãããã¥ã¡ã³ããåç §ãã䟡å€ããããŸããããšãã°ãã¡ãŒã¿ã®ã¿ã€ãïŒMeterïŒã«ã€ããŠè©³çްã«èª¬æãããŠããŸãã
ãªã³ã¯
çµéšã亀æããããšã§ãããŸããŸãªã¢ãããŒããããŒã«ããã¯ãããžãŒããã°ããç¿åŸããåé²ããããšãã§ããŸãããããã£ãŠããã®ãããã¯ã§æãæçšãªè³æãç¡èŠããããšã¯ã§ããŸããããããã®è³æã¯ãèšäºã
Spring BootïŒMetrics WithMicrometerãããã³ãAWSCloudWatchSpringCloud
ãã§ã¯åç §ãããŠããŸãããAmazonWebãµãŒãã¹ã®äœ¿çšãSpringBootã®èªåæ§æ
Springin Action 5ãCraig WallsãManning
AmazonWebãµãŒãã¹ã§äººæ°
宿ãããããžã§ã¯ãã¯GitHubã«ãããŸãã