μλ νμΈμ, μ΄λ²μ μ΄λ²€νΈλλ¦¬λΈ μλΉμ€μ κ°μ μμ μ νλ€κ° μκ²λ cloudwatch ν΅κ³μ§ν μ‘°νλ°©λ²μ 곡μ λ립λλ€.
μ΄ μμ μ νκ²λ μ΄μ λ₯Ό λ§μλ리μλ©΄ μ΄λ μ΅λλ€.
νμ¬ SQS λ₯Ό μ΄μ©ν μ΄λ²€νΈλλ¦¬λΈ νκ²½μμ λμνλ μλΉμ€κ° μμ΅λλ€.
μ΄λ° μ λ° μ 보λ€μ λκΈ°ννκΈ° μν λͺ©μ μΌλ‘ μ¬μ©νκ³ μκ³ , μ΄ μλΉμ€λ λ©ν°μ°λ λ νκ²½μμ λμνλλ‘ λμ΄μμ΅λλ€.
νΉμλΌλ μ΄λ²€νΈκ° μ§μ°λ κ²½μ°λ₯Ό λλΉν΄μ μ°λ λ κ°μλ₯Ό μμλ‘ μλμ‘°μ ν μ μλλ‘ κ΅¬μ±ν΄λμμ£ .
κ·Έλ¦¬κ³ μ§μ°μ΄ λ°μνμ¬ SQS λ©μμ§κ° λ°νλ λ€ μΌμ μκ°λμ μ²λ¦¬λ₯Ό λͺ»νμ¬ νμ κ³μ λ¨μμκ²λλ©΄ alertκ° λ°μνλλ‘ λμ΄μμ΅λλ€.
μ¦, SQSμ ApproximateAgeOfOldestMessage μ§νκ°μλ³΄κ³ λ무 μ€λλμ μ²λ¦¬κ° μλ κ²½μ° alertλ₯Ό λ°κ³ μλμΌλ‘ μ°λ λ κ°μλ₯Ό μ‘°μ νλ ννλ‘ μκΈ°λ₯Ό λ²μ΄λκ³ μμ΅λλ€. κ·Έλ°λ° μ΄ λλ¬Όλ λλ¬Έ μ¬κ±΄μ΄λΌλ κ°λ°μλΌλ©΄, κ·Έλ¦¬κ³ κ°λ₯ν μΌμ΄μ€λΌλ©΄ κ·Έλ₯ μ λΆ λ€ μλνλ₯Ό ν΄λμμΌ νμ§ μμκΉ μκ°μ΄ λ€μ΄ κ°μ μμ μ λ€μ΄κ°μ΅λλ€.
μΌλ¨ SQSμμ μ 곡νλ λͺ¨λν°λ§ μ§νλ μλμ κ°μ΅λλ€. (AWS μ½μνλ©΄μ λͺ¨λν°λ§ νμμ λ³Ό μ μλ κ²λ€μ λλ€)
- Approximate Number Of Messages Delayed
- Approximate Number Of Messages Not Visible
- Approximate Number Of Messages Visible
- Approximate Age Of Oldest Message
- Number Of Empty Receives
- Number Of Messages Deleted
- Number Of Messages Received
- Number Of Messages Sent
- Sent Message Size
μ΄ μ§νμ ν΄λΉνλ ν΅κ³μμΉλ cloudwatch μμ μμ§μ΄ λ©λλ€.
ν΄λΌμ°λμμΉμμ μμ§λ λ°μ΄ν°λ₯Ό κ°μ§κ³ λͺ¨λν°λ§νμ κ·Έλνλ‘ λ³΄μ¬μ£Όλ κ²μ΄μ£ .
μ΄μ μ κ° μνλ Approximate Age Of Oldest Message μ λν λ°μ΄ν°λ₯Ό λ½μ보λλ‘ νκ² μ΅λλ€.
μΌλ¨ μ±μ ꡬμ±μ λ€μκ³Ό κ°μ΅λλ€.
- SpringBoot 2.3.x
- AWS Java SDK 1.11.x
- Java 11
AWS java sdk μμλ cloudwatch μλΉμ€μμ μ 곡νλ APIλ₯Ό νΈμΆνμ¬ ν΄λΌμ°λμμΉ λ°μ΄ν°λ₯Ό μ‘°νν μ μλλ‘ cloudwatch clientλ₯Ό μ 곡ν©λλ€. μ μΌ λ¨Όμ μ΄ ν΄λΌμ΄μΈνΈλ₯Ό λΉμΌλ‘ λ±λ‘ν©λλ€.
@Configuration
public class AWSConfig {
private AWSCredentialsProvider awsCredentialsProvider() {
List<AWSCredentialsProvider> credentialsProviders = new ArrayList<>();
credentialsProviders.add(new InstanceProfileCredentialsProvider(true));
credentialsProviders.add(new ProfileCredentialsProvider());
return new AWSCredentialsProviderChain(credentialsProviders);
}
@Bean
public AmazonCloudWatch cloudWatchClient() {
return AmazonCloudWatchClientBuilder.standard()
.withCredentials(awsCredentialsProvider())
.withRegion(Regions.fromName("ap-northeast-2"))
.build()
;
}
}
κ·Έλ¦¬κ³ μλΉμ€ λ μ΄μ΄μμ μ΄ cloudWatchClientλ₯Ό κ°μ Έλ€ μ¨λ³΄κ² μ΅λλ€.
private void getQueueStatus(String queueName) {
long currentMillis = System.currentTimeMillis();
long fiveMinutesInMillis = 5 * 60 * 1000;
GetMetricStatisticsRequest statisticsRequest = new GetMetricStatisticsRequest()
.withNamespace("AWS/SQS").withMetricName("ApproximateAgeOfOldestMessage")
.withStatistics(Statistic.Maximum).withPeriod(300)
.withStartTime(new Date(currentMillis - fiveMinutesInMillis))
.withEndTime(new Date(currentMillis))
.withDimensions(new Dimension().withName("QueueName").withValue(queueName));
GetMetricStatisticsResult result = cloudWatch.getMetricStatistics(statisticsRequest);
log.debug("dataPoints: {}", result.getDatapoints());
}
cloudWatchClient λ₯Ό μ΄μ©νμ¬ ν΅κ³μμΉ λ°μ΄ν°λ₯Ό μ‘°ννλ €λ©΄ GetMetricStatisticsRequest κ°μ²΄λ₯Ό λ§λ€μ΄μ λ£μ΄μ£Όμ΄μΌ ν©λλ€.
μ΄ κ°μ²΄μ μ€μ ν΄μ€μΌ νλ κ°λ€ μ€ νμμ μΈ κ²λ€λ§ μ€μ ν΄λ³΄μμ΅λλ€.
κ°λ΅ν μ€λͺ νμλ©΄ λ€μκ³Ό κ°μ΅λλ€.
- withNameSpace: cloudwatchμμ μλΉμ€λ₯Ό ꡬλΆνλ κ° (ex. "AWS/SQS", "AWS/EC2", etc.)
- withMetricName: μ‘°ννκ³ μνλ λ©νΈλ¦ λͺ
- withStatistics: Statistic μμ μ 곡νλ ν΅κ³κΈ°μ€(?), enumμΌλ‘ μ μλμ΄μμ
- SampleCount
- Average
- Sum
- Minimum
- Maximum
- withStartTime, withEndTime: μ‘°ννλ €λ λ°μ΄ν° κ΅¬κ° (λ°μ΄ν°μ μμ μμ κ³Ό μ’ λ£ μμ )
- withPeriod: μ‘°ννλ €λ λ°μ΄ν° κ΅¬κ° λ΄μμμ λ°μ΄ν° κ°κ²©. μλ₯Όλ€λ©΄ μ§λ 1μκ° λμ λͺ λΆ κ°κ²©μΌλ‘ λ°μ΄ν°λ₯Ό μ‘°νν μ§λ₯Ό μλ―Έ. μ΄λ¨μκ°
- withDimensions: SQSμ κ²½μ° "QueueName" νλλ§ μκ³ , μ΄ κ°μΌλ‘ μ΄λ€ sqsμ λν λ°μ΄ν°μΈμ§ κ΅¬λΆ κ°λ₯.
(μ°Έκ³ : Available CloudWatch metrics for Amazon SQS)
μ€μ κ°μ νμ¬ μ§λ 5λΆλμ(from endTime to startTime) 5λΆκ°κ²©(period)μ λ°μ΄ν°λ₯Ό μ‘°ννλλ‘ λμ΄μμΌλ―λ‘ 1κ°μ data point κ° μ‘°νκ° λ©λλ€. κ·Έλ¦¬κ³ unitμ μ΄λ¨μλ‘ λμ΅λλ€.
μ μ½λλ₯Ό μ€νν΄μ μ‘°νν sqsμ Approximate Age Of Oldest Message μ§νκ°μ λ€μκ³Ό κ°μ΄ μΆλ ₯λ©λλ€.
dataPoints: [{Timestamp: Thu Dec 29 16:08:00 KST 2022,Maximum: 249.0,Unit: Seconds,}]
μ€μ κ°μ λ³κ²½νμ¬ periodλ₯Ό 60μΌλ‘ λ£μ΄μ μ€ννλ©΄ 5κ°κ° μ‘°νλ©λλ€.
dataPoints: [{Timestamp: Thu Dec 29 17:03:00 KST 2022,Maximum: 3254.0,Unit: Seconds,}, {Timestamp: Thu Dec 29 17:07:00 KST 2022,Maximum: 3554.0,Unit: Seconds,}, {Timestamp: Thu Dec 29 17:05:00 KST 2022,Maximum: 3433.0,Unit: Seconds,}, {Timestamp: Thu Dec 29 17:06:00 KST 2022,Maximum: 3491.0,Unit: Seconds,}, {Timestamp: Thu Dec 29 17:04:00 KST 2022,Maximum: 3370.0,Unit: Seconds,}]
μ‘°νλ 5κ°μ λ°μ΄ν°λ μ§λ 5λΆ κ΅¬κ°(startTime, endTime)μμ 1λΆ κ°κ²©(period) λ°μ΄ν°λ₯Ό μ‘°ννμ λμ κ²°κ³Όμ λλ€. κ·Έλ¦¬κ³ μ΄ κ°μ Approximate Age Of Oldest Message, μ¦, λλ΅μ μΌλ‘ μΌλ§λ μ€λλμλκ°λ₯Ό λνλ΄λ κ°μ΄λ―λ‘ 1λΆ κ°κ²© λ°μ΄ν°λ₯Ό μ‘°ννλ€λ©΄ μ½ 1λΆ(60μ΄)μ μκ°μ°¨μ΄κ° μκ² μ£ . μΆλ ₯λ λ°μ΄ν°μ μμκ° μκ°μμ΄ μλλ μκ°μμΌλ‘ μ λ ¬ν΄λ³΄λ©΄ μ½ 1λΆ μ λ μ°¨μ΄κ° λλ€λ κ²μ νμΈν μ μμ΅λλ€.
[
{Timestamp: Thu Dec 29 17:03:00 KST 2022,Maximum: 3254.0,Unit: Seconds,},
{Timestamp: Thu Dec 29 17:04:00 KST 2022,Maximum: 3370.0,Unit: Seconds,}
{Timestamp: Thu Dec 29 17:05:00 KST 2022,Maximum: 3433.0,Unit: Seconds,},
{Timestamp: Thu Dec 29 17:06:00 KST 2022,Maximum: 3491.0,Unit: Seconds,},
{Timestamp: Thu Dec 29 17:07:00 KST 2022,Maximum: 3554.0,Unit: Seconds,},
]
17:03 μμ 17:04λ μμΈμ μΌλ‘ μ½ 2λΆ μ°¨μ΄κ° λλ€μ ^^;;
μ΄μμΌλ‘ AWS cloudwatch APIλ‘ SQSμ metricμ μ‘°ννλ λ°©λ²μ λν΄ μμ보μμ΅λλ€.
μ λ μ΄λ κ² μ‘°νν λ°μ΄ν°λ₯Ό κ°μ§κ³ μΌμ μκ°μ λμ΄μ€ κ²½μ° μ°λ λ κ°μλ₯Ό scale in/out νλλ‘ μλΉμ€λ₯Ό ꡬννμ΅λλ€.
λμμ΄ λμ ¨λ€λ©΄ 곡κ°κΎΉ λΆνλλ €μ~