Skip to content

Commit 807132f

Browse files
meltsufinTravis Tomsu
authored and
Travis Tomsu
committed
Multiple fixes for the metrics auto-config and sample
1 parent d730d56 commit 807132f

File tree

10 files changed

+48
-40
lines changed

10 files changed

+48
-40
lines changed

docs/src/main/asciidoc/metrics.adoc

+9-23
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
Google Cloud Platform provides a service called https://cloud.google.com/monitoring/[Stackdriver Monitoring], and https://micrometer.io/docs/registry/stackdriver[Micrometer] can be used with it to easily instrument Spring Boot applications for observability.
44

5-
Spring Boot already provides auto-configuration for Stackdriver. This module enables to auto-detect the `project-id` and `credentials`. Also, it can be customized.
5+
Spring Boot already provides auto-configuration for Stackdriver.
6+
This module enables auto-detection of the `project-id` and `credentials`.
7+
Also, it can be customized.
68

79
Maven coordinates, using <<getting-started.adoc#_bill_of_materials, Spring Cloud GCP BOM>>:
810

@@ -26,30 +28,10 @@ dependencies {
2628
You must enable Stackdriver Monitoring API from the Google Cloud Console in order to capture metrics.
2729
Navigate to the https://console.cloud.google.com/apis/api/monitoring.googleapis.com/overview[Stackdriver Monitoring API] for your project and make sure it’s enabled.
2830

29-
This starter requires `org.springframework.boot:spring-boot-starter-actuator` dependency to activate. Make sure the dependency is being declared.
30-
31-
Maven coordinates:
32-
33-
----
34-
<dependency>
35-
<groupId>org.springframework.boot</groupId>
36-
<artifactId>spring-boot-starter-actuator</artifactId>
37-
</dependency>
38-
----
39-
40-
Gradle coordinates:
41-
42-
[source,subs="normal"]
43-
----
44-
dependencies {
45-
implementation("org.springframework.boot:spring-boot-starter-actuator")
46-
}
47-
----
48-
49-
=== Spring Boot Starter for Stackdriver Monitoring
50-
5131
Spring Boot Starter for Stackdriver Monitoring uses Micrometer.
5232

33+
=== Configuration
34+
5335
All configurations are optional:
5436

5537
|===
@@ -63,3 +45,7 @@ All configurations are optional:
6345

6446
You can use core Spring Boot Actuator properties to control reporting frequency, etc.
6547
Read https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-metrics-export-stackdriver[Spring Boot Actuator documentation] for more information on Stackdriver Actuator configurations.
48+
49+
=== Sample
50+
51+
A https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/master/spring-cloud-gcp-samples/spring-cloud-gcp-metrics-sample[sample application] is available.

spring-cloud-gcp-autoconfigure/src/main/java/com/google/cloud/spring/autoconfigure/metrics/GcpStackdriverMetricsAutoConfiguration.java

+21-2
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,16 @@
1919
import java.io.IOException;
2020

2121
import com.google.api.gax.core.CredentialsProvider;
22+
import com.google.cloud.monitoring.v3.MetricServiceSettings;
2223
import com.google.cloud.spring.core.DefaultCredentialsProvider;
2324
import com.google.cloud.spring.core.GcpProjectIdProvider;
25+
import com.google.cloud.spring.core.UserAgentHeaderProvider;
2426
import io.micrometer.core.instrument.Clock;
25-
import io.micrometer.core.instrument.step.StepMeterRegistry;
2627
import io.micrometer.stackdriver.StackdriverConfig;
28+
import io.micrometer.stackdriver.StackdriverMeterRegistry;
2729

2830
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
31+
import org.springframework.boot.actuate.autoconfigure.metrics.export.ConditionalOnEnabledMetricsExport;
2932
import org.springframework.boot.actuate.autoconfigure.metrics.export.stackdriver.StackdriverMetricsExportAutoConfiguration;
3033
import org.springframework.boot.actuate.autoconfigure.metrics.export.stackdriver.StackdriverProperties;
3134
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -47,8 +50,9 @@
4750
@Configuration(proxyBeanMethods = false)
4851
@AutoConfigureBefore(StackdriverMetricsExportAutoConfiguration.class)
4952
@AutoConfigureAfter(MetricsAutoConfiguration.class)
50-
@ConditionalOnClass({StepMeterRegistry.class, StackdriverConfig.class})
53+
@ConditionalOnClass(StackdriverMeterRegistry.class)
5154
@ConditionalOnBean(Clock.class)
55+
@ConditionalOnEnabledMetricsExport("stackdriver")
5256
@EnableConfigurationProperties({GcpMetricsProperties.class, StackdriverProperties.class})
5357
@ConditionalOnProperty(value = "spring.cloud.gcp.metrics.enabled", matchIfMissing = true, havingValue = "true")
5458
public class GcpStackdriverMetricsAutoConfiguration {
@@ -75,4 +79,19 @@ public StackdriverConfig stackdriverConfig() {
7579
return new GcpStackdriverPropertiesConfigAdapter(this.stackdriverProperties, this.projectId, this.credentialsProvider);
7680
}
7781

82+
@Bean
83+
@ConditionalOnMissingBean
84+
public MetricServiceSettings metricServiceSettings() throws IOException {
85+
return MetricServiceSettings.newBuilder().setHeaderProvider(new UserAgentHeaderProvider(GcpStackdriverMetricsAutoConfiguration.class)).build();
86+
}
87+
88+
@Bean
89+
@ConditionalOnMissingBean
90+
public StackdriverMeterRegistry stackdriverMeterRegistry(StackdriverConfig stackdriverConfig, Clock clock, MetricServiceSettings metricServiceSettings) {
91+
return StackdriverMeterRegistry.builder(stackdriverConfig)
92+
.clock(clock)
93+
.metricServiceSettings(() -> metricServiceSettings)
94+
.build();
95+
}
96+
7897
}

spring-cloud-gcp-autoconfigure/src/test/java/com/google/cloud/spring/autoconfigure/pubsub/it/PubSubTemplateDocumentationIntegrationTests.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import com.google.pubsub.v1.Topic;
4343
import org.awaitility.Awaitility;
4444
import org.awaitility.Duration;
45-
import org.jetbrains.annotations.NotNull;
4645
import org.junit.BeforeClass;
4746
import org.junit.Test;
4847

@@ -298,7 +297,7 @@ public PubSubMessageHandler pubSubMessageHandler(PubSubTemplate pubSubTemplate)
298297
// tag::adapter_callback[]
299298
adapter.setPublishCallback(new ListenableFutureCallback<String>() {
300299
@Override
301-
public void onFailure(@NotNull Throwable ex) {
300+
public void onFailure(Throwable ex) {
302301
}
303302

304303
@Override

spring-cloud-gcp-samples/spring-cloud-gcp-metrics-sample/README.adoc

+5-3
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@ Run the sample application from Maven:
1616
$ mvn spring-boot:run
1717
----
1818

19-
Then, issue a request to `localhost:8080/` endpoint and verify that a label appears in Stackdriver:
19+
Then, issue a request to `localhost:8080/{custom metric name}` endpoint and verify that the metric appears in Stackdriver:
2020

2121
----
22-
$ curl localhost:8080/
22+
$ curl localhost:8080/my_ping_counter
2323
----
2424

25+
Metrics are reported to Stackdriver every 60 seconds.
26+
So, wait a minute for the custom metric to be reported.
2527
To see the metrics, navigate to the https://console.cloud.google.com/monitoring/metrics-explorer[Monitoring section of the Cloud Console].
26-
Select the `custom/ping` metric to see the tracked metric.
28+
Select the `custom/my_ping_counter` metric to see the tracked metric.
2729

2830
=== Running on Google Cloud Platform
2931

spring-cloud-gcp-samples/spring-cloud-gcp-metrics-sample/pom.xml

-4
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@
2828
</dependencyManagement>
2929

3030
<dependencies>
31-
<dependency>
32-
<groupId>org.springframework.boot</groupId>
33-
<artifactId>spring-boot-starter-actuator</artifactId>
34-
</dependency>
3531
<dependency>
3632
<groupId>org.springframework.boot</groupId>
3733
<artifactId>spring-boot-starter-web</artifactId>

spring-cloud-gcp-samples/spring-cloud-gcp-metrics-sample/src/main/java/com/example/ExampleController.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818

1919
import io.micrometer.core.instrument.MeterRegistry;
2020

21+
import org.springframework.web.bind.annotation.GetMapping;
2122
import org.springframework.web.bind.annotation.PathVariable;
22-
import org.springframework.web.bind.annotation.PostMapping;
2323
import org.springframework.web.bind.annotation.RestController;
2424

2525
@RestController
@@ -31,9 +31,9 @@ public ExampleController(MeterRegistry meterRegistry) {
3131
this.meterRegistry = meterRegistry;
3232
}
3333

34-
@PostMapping("/{id}")
34+
@GetMapping("/{id}")
3535
public String counter(@PathVariable String id) {
3636
this.meterRegistry.counter(id).increment();
37-
return "Ping return successfully";
37+
return "Incremented " + id + " counter successfully";
3838
}
3939
}
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
management.endpoints.web.exposure.include=*
1+
# (optional) enable access to http://localhost:8080/actuator/metrics
2+
management.endpoints.web.exposure.include=metrics

spring-cloud-gcp-samples/spring-cloud-gcp-metrics-sample/src/test/java/com/example/MetricsSampleApplicationIntegrationTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public void testMetricRecordedInStackdriver() {
8282
String id = "integration_test_" + UUID.randomUUID().toString().replace('-', '_');
8383
String url = String.format("http://localhost:%s/%s", this.port, id);
8484

85-
ResponseEntity<String> responseEntity = this.testRestTemplate.postForEntity(url, null, String.class);
85+
ResponseEntity<String> responseEntity = this.testRestTemplate.getForEntity(url, String.class, String.class);
8686
assertThat(responseEntity.getStatusCode().is2xxSuccessful()).isTrue();
8787

8888
String metricType = "custom.googleapis.com/" + id;

spring-cloud-gcp-starters/spring-cloud-gcp-starter-metrics/pom.xml

+4
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,9 @@
2222
<groupId>io.micrometer</groupId>
2323
<artifactId>micrometer-registry-stackdriver</artifactId>
2424
</dependency>
25+
<dependency>
26+
<groupId>org.springframework.boot</groupId>
27+
<artifactId>spring-boot-starter-actuator</artifactId>
28+
</dependency>
2529
</dependencies>
2630
</project>

spring-cloud-gcp-vision/src/main/java/com/google/cloud/spring/vision/OcrPageRange.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.google.cloud.spring.vision;
1818

19+
import java.nio.charset.StandardCharsets;
1920
import java.util.List;
2021
import java.util.regex.Matcher;
2122
import java.util.regex.Pattern;
@@ -96,7 +97,7 @@ private static List<TextAnnotation> parseJsonBlob(Blob blob)
9697
throws InvalidProtocolBufferException {
9798

9899
AnnotateFileResponse.Builder annotateFileResponseBuilder = AnnotateFileResponse.newBuilder();
99-
String jsonContent = new String(blob.getContent());
100+
String jsonContent = new String(blob.getContent(), StandardCharsets.UTF_8);
100101
JsonFormat.parser().ignoringUnknownFields().merge(jsonContent, annotateFileResponseBuilder);
101102

102103
AnnotateFileResponse annotateFileResponse = annotateFileResponseBuilder.build();

0 commit comments

Comments
 (0)