Skip to content

Commit 2e3dbae

Browse files
committed
Fix
1 parent efa85f8 commit 2e3dbae

File tree

6 files changed

+170
-39
lines changed

6 files changed

+170
-39
lines changed

agent/agent-tooling/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ dependencies {
4141
implementation("com.azure:azure-identity") {
4242
exclude("org.ow2.asm", "asm")
4343
}
44+
implementation("com.azure:azure-json")
4445

4546
compileOnly("io.opentelemetry:opentelemetry-api-incubator")
4647
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/profiler/config/ProfilerConfiguration.java

Lines changed: 86 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33

44
package com.microsoft.applicationinsights.agent.internal.profiler.config;
55

6+
import com.azure.json.JsonReader;
67
import com.azure.json.JsonSerializable;
8+
import com.azure.json.JsonToken;
79
import com.azure.json.JsonWriter;
810
import com.fasterxml.jackson.databind.util.StdDateFormat;
11+
import com.microsoft.applicationinsights.agent.internal.profiler.util.TimestampContract;
912
import com.microsoft.applicationinsights.alerting.aiconfig.AlertingConfig;
1013
import java.io.IOException;
1114
import java.text.ParseException;
@@ -16,29 +19,43 @@
1619
public class ProfilerConfiguration implements JsonSerializable<ProfilerConfiguration> {
1720

1821
public static final Date DEFAULT_DATE;
19-
private Date lastModified;
20-
private boolean enabled;
21-
private String collectionPlan;
22-
private String cpuTriggerConfiguration;
23-
private String memoryTriggerConfiguration;
24-
private String defaultConfiguration;
25-
private List<AlertingConfig.RequestTrigger> requestTriggerConfiguration;
22+
// TODO find an alternative to com.fasterxml.jackson.databind.util.StdDateFormat
23+
private static final StdDateFormat STD_DATE_FORMAT;
2624

2725
static {
26+
STD_DATE_FORMAT = new StdDateFormat();
2827
Date defaultDate;
2928
try {
30-
defaultDate = new StdDateFormat().parse("0001-01-01T00:00:00+00:00");
29+
defaultDate = STD_DATE_FORMAT.parse("0001-01-01T00:00:00+00:00");
3130
} catch (ParseException e) {
32-
// will not happen
3331
defaultDate = null;
3432
}
3533
DEFAULT_DATE = defaultDate;
3634
}
3735

36+
private String id;
37+
private Date lastModified;
38+
private Date enabledLastModified;
39+
private boolean enabled;
40+
private String collectionPlan;
41+
private String cpuTriggerConfiguration;
42+
private String memoryTriggerConfiguration;
43+
private String defaultConfiguration;
44+
private List<AlertingConfig.RequestTrigger> requestTriggerConfiguration;
45+
3846
public boolean hasBeenConfigured() {
3947
return getLastModified().compareTo(DEFAULT_DATE) != 0;
4048
}
4149

50+
public String id() {
51+
return id;
52+
}
53+
54+
public ProfilerConfiguration setId(String id) {
55+
this.id = id;
56+
return this;
57+
}
58+
4259
public Date getLastModified() {
4360
return lastModified;
4461
}
@@ -48,6 +65,15 @@ public ProfilerConfiguration setLastModified(Date lastModified) {
4865
return this;
4966
}
5067

68+
public Date getEnabledLastModified() {
69+
return enabledLastModified;
70+
}
71+
72+
public ProfilerConfiguration setEnabledLastModified(Date enabledLastModified) {
73+
this.enabledLastModified = enabledLastModified;
74+
return this;
75+
}
76+
5177
public boolean isEnabled() {
5278
return enabled;
5379
}
@@ -111,7 +137,10 @@ public ProfilerConfiguration setRequestTriggerConfiguration(
111137
@Override
112138
public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
113139
jsonWriter.writeStartObject();
114-
jsonWriter.writeLongField("lastModified", lastModified.getTime());
140+
jsonWriter.writeStringField("id", id);
141+
jsonWriter.writeStringField("lastModified", STD_DATE_FORMAT.format(lastModified));
142+
jsonWriter.writeStringField(
143+
"enabledLastModified", TimestampContract.timestampToString(enabledLastModified));
115144
jsonWriter.writeBooleanField("enabled", enabled);
116145
jsonWriter.writeStringField("collectionPlan", collectionPlan);
117146
jsonWriter.writeStringField("cpuTriggerConfiguration", cpuTriggerConfiguration);
@@ -125,4 +154,51 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
125154
jsonWriter.writeEndObject();
126155
return jsonWriter;
127156
}
157+
158+
public static ProfilerConfiguration fromJson(JsonReader jsonReader) throws IOException {
159+
return jsonReader.readObject(
160+
reader -> {
161+
ProfilerConfiguration deserializedProfilerConfiguration = new ProfilerConfiguration();
162+
while (reader.nextToken() != JsonToken.END_OBJECT) {
163+
reader.nextToken();
164+
String fieldName = reader.getFieldName();
165+
if ("id".equals(fieldName)) {
166+
String id = reader.getString();
167+
deserializedProfilerConfiguration.setId(id);
168+
} else if ("lastModified".equals(fieldName)) {
169+
String lastModified = reader.getString();
170+
try {
171+
deserializedProfilerConfiguration.setLastModified(
172+
new StdDateFormat().parse(lastModified));
173+
} catch (ParseException ignored) {
174+
deserializedProfilerConfiguration.setLastModified(DEFAULT_DATE);
175+
}
176+
} else if ("enabledLastModified".equals(fieldName)) {
177+
String enabledLastModified = reader.getString();
178+
try {
179+
deserializedProfilerConfiguration.setEnabledLastModified(
180+
STD_DATE_FORMAT.parse(enabledLastModified));
181+
} catch (ParseException ignored) {
182+
deserializedProfilerConfiguration.setEnabledLastModified(DEFAULT_DATE);
183+
}
184+
} else if ("enabled".equals(fieldName)) {
185+
deserializedProfilerConfiguration.setEnabled(reader.getBoolean());
186+
} else if ("collectionPlan".equals(fieldName)) {
187+
deserializedProfilerConfiguration.setCollectionPlan(reader.getString());
188+
} else if ("cpuTriggerConfiguration".equals(fieldName)) {
189+
deserializedProfilerConfiguration.setCpuTriggerConfiguration(reader.getString());
190+
} else if ("memoryTriggerConfiguration".equals(fieldName)) {
191+
deserializedProfilerConfiguration.setMemoryTriggerConfiguration(reader.getString());
192+
} else if ("defaultConfiguration".equals(fieldName)) {
193+
deserializedProfilerConfiguration.setDefaultConfiguration(reader.getString());
194+
} else if ("requestTriggerConfiguration".equals(fieldName)) {
195+
deserializedProfilerConfiguration.setRequestTriggerConfiguration(
196+
reader.readArray(AlertingConfig.RequestTrigger::fromJson));
197+
} else {
198+
reader.skipChildren();
199+
}
200+
}
201+
return deserializedProfilerConfiguration;
202+
});
203+
}
128204
}

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/profiler/service/ArtifactAcceptedResponse.java

Lines changed: 74 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,87 @@
33

44
package com.microsoft.applicationinsights.agent.internal.profiler.service;
55

6-
import com.fasterxml.jackson.annotation.JsonCreator;
7-
import com.fasterxml.jackson.annotation.JsonProperty;
8-
import com.google.auto.value.AutoValue;
6+
import com.azure.json.JsonReader;
7+
import com.azure.json.JsonSerializable;
8+
import com.azure.json.JsonToken;
9+
import com.azure.json.JsonWriter;
10+
import java.io.IOException;
911

1012
/** Result of uploading an artifact to service profiler. */
11-
@AutoValue
12-
public abstract class ArtifactAcceptedResponse {
13+
public class ArtifactAcceptedResponse implements JsonSerializable<ArtifactAcceptedResponse> {
1314

14-
@JsonCreator
15-
public static ArtifactAcceptedResponse create(
16-
@JsonProperty("acceptedTime") String acceptedTime,
17-
@JsonProperty("blobUri") String blobUri,
18-
@JsonProperty("correlationId") String correlationId,
19-
@JsonProperty("stampId") String stampId) {
15+
private String acceptedTime;
16+
private String stampId;
17+
private String correlationId;
18+
private String blobUri;
2019

21-
return new AutoValue_ArtifactAcceptedResponse(acceptedTime, stampId, correlationId, blobUri);
20+
public String getAcceptedTime() {
21+
return acceptedTime;
2222
}
2323

24-
public abstract String getAcceptedTime();
24+
public ArtifactAcceptedResponse setAcceptedTime(String acceptedTime) {
25+
this.acceptedTime = acceptedTime;
26+
return this;
27+
}
28+
29+
public String getStampId() {
30+
return stampId;
31+
}
32+
33+
public ArtifactAcceptedResponse setStampId(String stampId) {
34+
this.stampId = stampId;
35+
return this;
36+
}
37+
38+
public String getCorrelationId() {
39+
return correlationId;
40+
}
2541

26-
public abstract String getStampId();
42+
public ArtifactAcceptedResponse setCorrelationId(String correlationId) {
43+
this.correlationId = correlationId;
44+
return this;
45+
}
46+
47+
public String getBlobUri() {
48+
return blobUri;
49+
}
2750

28-
public abstract String getCorrelationId();
51+
public ArtifactAcceptedResponse setBlobUri(String blobUri) {
52+
this.blobUri = blobUri;
53+
return this;
54+
}
2955

30-
public abstract String getBlobUri();
56+
@Override
57+
public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
58+
jsonWriter.writeStartObject();
59+
jsonWriter.writeStringField("acceptedTime", acceptedTime);
60+
jsonWriter.writeStringField("stampId", stampId);
61+
jsonWriter.writeStringField("correlationId", correlationId);
62+
jsonWriter.writeStringField("blobUri", blobUri);
63+
jsonWriter.writeEndObject();
64+
return jsonWriter;
65+
}
66+
67+
public static ArtifactAcceptedResponse fromJson(JsonReader jsonReader) throws IOException {
68+
return jsonReader.readObject(
69+
reader -> {
70+
ArtifactAcceptedResponse deserializedArtifactAcceptedResponse =
71+
new ArtifactAcceptedResponse();
72+
while (reader.nextToken() != JsonToken.END_OBJECT) {
73+
String fieldName = reader.getFieldName();
74+
if ("acceptedTime".equals(fieldName)) {
75+
deserializedArtifactAcceptedResponse.setAcceptedTime(reader.getString());
76+
} else if ("stampId".equals(fieldName)) {
77+
deserializedArtifactAcceptedResponse.setStampId(reader.getString());
78+
} else if ("correlationId".equals(fieldName)) {
79+
deserializedArtifactAcceptedResponse.setCorrelationId(reader.getString());
80+
} else if ("blobUri".equals(fieldName)) {
81+
deserializedArtifactAcceptedResponse.setBlobUri(reader.getString());
82+
} else {
83+
reader.skipChildren();
84+
}
85+
}
86+
return deserializedArtifactAcceptedResponse;
87+
});
88+
}
3189
}

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/profiler/service/ServiceProfilerClient.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
import com.azure.core.http.HttpPipeline;
99
import com.azure.core.http.HttpRequest;
1010
import com.azure.core.http.HttpResponse;
11-
import com.fasterxml.jackson.databind.DeserializationFeature;
12-
import com.fasterxml.jackson.databind.ObjectMapper;
11+
import com.azure.json.JsonProviders;
12+
import com.azure.json.JsonReader;
1313
import com.microsoft.applicationinsights.agent.internal.profiler.config.ProfilerConfiguration;
1414
import com.microsoft.applicationinsights.agent.internal.profiler.util.TimestampContract;
1515
import java.io.IOException;
@@ -27,9 +27,6 @@ public class ServiceProfilerClient {
2727

2828
private static final Logger logger = LoggerFactory.getLogger(ServiceProfilerClient.class);
2929

30-
private static final ObjectMapper mapper =
31-
new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
32-
3330
private static final String PROFILER_API_PREFIX = "api/profileragent/v4";
3431

3532
private static final String INSTRUMENTATION_KEY_PARAMETER = "iKey";
@@ -108,9 +105,8 @@ public Mono<ArtifactAcceptedResponse> reportUploadFinish(
108105
// this shouldn't happen, the mono should complete with a response or a failure
109106
return Mono.error(new AssertionError("response body mono returned empty"));
110107
}
111-
try {
112-
ArtifactAcceptedResponse data =
113-
mapper.readValue(json, ArtifactAcceptedResponse.class);
108+
try (JsonReader reader = JsonProviders.createReader(json)) {
109+
ArtifactAcceptedResponse data = ArtifactAcceptedResponse.fromJson(reader);
114110
if (data == null) {
115111
return Mono.error(new IllegalStateException("Failed to deserialize response"));
116112
}
@@ -165,8 +161,8 @@ private static Mono<ProfilerConfiguration> handle(HttpResponse response, URL req
165161
.getBodyAsString()
166162
.flatMap(
167163
body -> {
168-
try {
169-
return Mono.just(mapper.readValue(body, ProfilerConfiguration.class));
164+
try (JsonReader jsonReader = JsonProviders.createReader(body)) {
165+
return Mono.just(ProfilerConfiguration.fromJson(jsonReader));
170166
} catch (IOException e) {
171167
return Mono.error(e);
172168
}

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/profiler/util/TimestampContract.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
*/
2323
public final class TimestampContract {
2424
// Cant use ISO_INSTANT as it does not pad the nanos to 7 figures
25-
private static final DateTimeFormatter FORMATTER =
25+
public static final DateTimeFormatter FORMATTER =
2626
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.nX", Locale.ROOT);
2727

2828
private static final Pattern TIMESTAMP_PATTERN = Pattern.compile(".*\\.([0-9]+)Z$");

agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/profiler/config/ConfigServiceTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import com.azure.core.http.HttpPipelineBuilder;
1212
import com.azure.core.test.TestBase;
1313
import com.azure.core.test.TestMode;
14-
import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
14+
import com.azure.json.implementation.jackson.core.JsonParseException;
1515
import com.microsoft.applicationinsights.agent.internal.profiler.service.ServiceProfilerClient;
1616
import java.io.IOException;
1717
import java.net.MalformedURLException;
@@ -61,7 +61,7 @@ void badServiceResponseDoesNotProvideReturn() throws MalformedURLException {
6161
ConfigService configService = new ConfigService(serviceProfilerClient);
6262
Mono<ProfilerConfiguration> result = configService.pullSettings();
6363

64-
assertThatThrownBy(result::block).hasRootCauseInstanceOf(InvalidDefinitionException.class);
64+
assertThatThrownBy(result::block).hasRootCauseInstanceOf(JsonParseException.class);
6565
}
6666

6767
private HttpPipeline getHttpPipeline() {

0 commit comments

Comments
 (0)