Skip to content

Commit e3b3f8c

Browse files
Module Storage Metrics (#4151)
1 parent 9e66886 commit e3b3f8c

29 files changed

+910
-42
lines changed

extra/modules/optable-targeting/src/main/java/org/prebid/server/hooks/modules/optable/targeting/v1/core/Cache.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111

1212
public class Cache {
1313

14-
private static final String APP_CODE = "prebid-Java";
15-
private static final String APPLICATION = "optable-targeting";
14+
private static final String APPLICATION = "prebid-Java";
15+
private static final String APP_CODE = "optable-targeting";
1616

1717
private final PbcStorageService cacheService;
1818
private final JacksonMapper mapper;

src/main/java/org/prebid/server/cache/BasicPbcStorageService.java

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@
1111
import org.prebid.server.exception.PreBidException;
1212
import org.prebid.server.json.DecodeException;
1313
import org.prebid.server.json.JacksonMapper;
14+
import org.prebid.server.metric.MetricName;
15+
import org.prebid.server.metric.Metrics;
1416
import org.prebid.server.util.HttpUtil;
1517
import org.prebid.server.vertx.httpclient.HttpClient;
1618

1719
import java.net.URL;
20+
import java.time.Clock;
1821
import java.util.Objects;
1922

2023
public class BasicPbcStorageService implements PbcStorageService {
@@ -27,18 +30,24 @@ public class BasicPbcStorageService implements PbcStorageService {
2730
private final String apiKey;
2831
private final int callTimeoutMs;
2932
private final JacksonMapper mapper;
33+
private final Clock clock;
34+
private final Metrics metrics;
3035

3136
public BasicPbcStorageService(HttpClient httpClient,
3237
URL endpointUrl,
3338
String apiKey,
3439
int callTimeoutMs,
35-
JacksonMapper mapper) {
40+
JacksonMapper mapper,
41+
Clock clock,
42+
Metrics metrics) {
3643

3744
this.httpClient = Objects.requireNonNull(httpClient);
3845
this.endpointUrl = Objects.requireNonNull(endpointUrl);
3946
this.apiKey = Objects.requireNonNull(apiKey);
4047
this.callTimeoutMs = callTimeoutMs;
4148
this.mapper = Objects.requireNonNull(mapper);
49+
this.clock = Objects.requireNonNull(clock);
50+
this.metrics = Objects.requireNonNull(metrics);
4251
}
4352

4453
@Override
@@ -55,20 +64,28 @@ public Future<Void> storeEntry(String key,
5564
return Future.failedFuture(e);
5665
}
5766

67+
final String valueToStore = prepareValueForStoring(value, type);
5868
final ModuleCacheRequest moduleCacheRequest =
5969
ModuleCacheRequest.of(
6070
constructEntryKey(key, appCode),
6171
type,
62-
prepareValueForStoring(value, type),
72+
valueToStore,
6373
application,
6474
ttlseconds);
6575

76+
updateCreativeMetrics(valueToStore, type, ttlseconds, appCode);
77+
78+
final long startTime = clock.millis();
6679
return httpClient.post(
6780
endpointUrl.toString(),
6881
securedCallHeaders(),
6982
mapper.encodeToString(moduleCacheRequest),
7083
callTimeoutMs)
71-
.compose(response -> processStoreResponse(response.getStatusCode(), response.getBody()));
84+
.compose(response -> processStoreResponse(
85+
response.getStatusCode(),
86+
response.getBody(),
87+
startTime,
88+
appCode));
7289

7390
}
7491

@@ -99,6 +116,19 @@ private static void validateStoreData(String key,
99116
}
100117
}
101118

119+
private void updateCreativeMetrics(String value, StorageDataType type, Integer ttlseconds, String appCode) {
120+
final MetricName metricName = switch (type) {
121+
case XML -> MetricName.xml;
122+
case JSON -> MetricName.json;
123+
case TEXT -> MetricName.text;
124+
};
125+
126+
metrics.updateModuleStorageCacheEntrySize(appCode, value.length(), metricName);
127+
if (ttlseconds != null) {
128+
metrics.updateModuleStorageCacheEntryTtl(appCode, ttlseconds, metricName);
129+
}
130+
}
131+
102132
private static String prepareValueForStoring(String value, StorageDataType type) {
103133
return type == StorageDataType.TEXT
104134
? new String(Base64.encodeBase64(value.getBytes()))
@@ -114,31 +144,35 @@ private String constructEntryKey(String key, String moduleCode) {
114144
return MODULE_KEY_PREFIX + MODULE_KEY_DELIMETER + moduleCode + MODULE_KEY_DELIMETER + key;
115145
}
116146

117-
private Future<Void> processStoreResponse(int statusCode, String responseBody) {
147+
private Future<Void> processStoreResponse(int statusCode, String responseBody, long startTime, String appCode) {
118148
if (statusCode != 204) {
149+
metrics.updateModuleStorageCacheWriteRequestTime(appCode, clock.millis() - startTime, MetricName.err);
119150
throw new PreBidException("HTTP status code: '%s', body: '%s' "
120151
.formatted(statusCode, responseBody));
121152
}
122153

154+
metrics.updateModuleStorageCacheWriteRequestTime(appCode, clock.millis() - startTime, MetricName.ok);
123155
return Future.succeededFuture();
124156
}
125157

126158
@Override
127-
public Future<ModuleCacheResponse> retrieveEntry(String key,
128-
String appCode,
129-
String application) {
130-
159+
public Future<ModuleCacheResponse> retrieveEntry(String key, String appCode, String application) {
131160
try {
132161
validateRetrieveData(key, application, appCode);
133162
} catch (PreBidException e) {
134163
return Future.failedFuture(e);
135164
}
136165

166+
final long startTime = clock.millis();
137167
return httpClient.get(
138168
getRetrieveEndpoint(key, appCode, application),
139169
securedCallHeaders(),
140170
callTimeoutMs)
141-
.map(response -> toModuleCacheResponse(response.getStatusCode(), response.getBody()));
171+
.map(response -> toModuleCacheResponse(
172+
response.getStatusCode(),
173+
response.getBody(),
174+
startTime,
175+
appCode));
142176

143177
}
144178

@@ -165,11 +199,18 @@ private String getRetrieveEndpoint(String key,
165199
+ "&a=" + application;
166200
}
167201

168-
private ModuleCacheResponse toModuleCacheResponse(int statusCode, String responseBody) {
202+
private ModuleCacheResponse toModuleCacheResponse(int statusCode,
203+
String responseBody,
204+
long startTime,
205+
String application) {
206+
169207
if (statusCode != 200) {
208+
metrics.updateModuleStorageCacheReadRequestTime(application, clock.millis() - startTime, MetricName.err);
170209
throw new PreBidException("HTTP status code " + statusCode);
171210
}
172211

212+
metrics.updateModuleStorageCacheReadRequestTime(application, clock.millis() - startTime, MetricName.ok);
213+
173214
final ModuleCacheResponse moduleCacheResponse;
174215
try {
175216
moduleCacheResponse = mapper.decodeValue(responseBody, ModuleCacheResponse.class);

src/main/java/org/prebid/server/cache/CoreCacheService.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -208,13 +208,6 @@ private BidCacheResponse processVtrackWriteCacheResponse(int statusCode,
208208
return bidCacheResponse;
209209
}
210210

211-
private <T> Future<T> failVtrackCacheWriteResponse(Throwable exception, String accountId, long startTime) {
212-
if (exception instanceof PreBidException) {
213-
metrics.updateVtrackCacheWriteRequestTime(accountId, clock.millis() - startTime, MetricName.err);
214-
}
215-
return failResponse(exception);
216-
}
217-
218211
public Future<BidCacheResponse> cachePutObjects(List<BidPutObject> bidPutObjects,
219212
Boolean isEventsEnabled,
220213
Set<String> biddersAllowingVastUpdate,
@@ -671,7 +664,7 @@ public Future<HttpClientResponse> getCachedObject(String key, String ch, Timeout
671664
final long startTime = clock.millis();
672665
return httpClient.get(url, cacheHeaders, remainingTimeout)
673666
.map(response -> processVtrackReadResponse(response, startTime))
674-
.recover(CoreCacheService::failResponse);
667+
.recover(exception -> failVtrackCacheReadResponse(exception, startTime));
675668
}
676669

677670
private HttpClientResponse processVtrackReadResponse(HttpClientResponse response, long startTime) {
@@ -683,16 +676,29 @@ private HttpClientResponse processVtrackReadResponse(HttpClientResponse response
683676
return response;
684677
}
685678

686-
metrics.updateVtrackCacheReadRequestTime(clock.millis() - startTime, MetricName.err);
687-
688679
try {
689680
final CacheErrorResponse errorResponse = mapper.decodeValue(body, CacheErrorResponse.class);
681+
metrics.updateVtrackCacheReadRequestTime(clock.millis() - startTime, MetricName.err);
690682
return HttpClientResponse.of(statusCode, response.getHeaders(), errorResponse.getMessage());
691683
} catch (DecodeException e) {
692684
throw new PreBidException("Cannot parse response: " + body, e);
693685
}
694686
}
695687

688+
private <T> Future<T> failVtrackCacheWriteResponse(Throwable exception, String accountId, long startTime) {
689+
if (exception instanceof PreBidException) {
690+
metrics.updateVtrackCacheWriteRequestTime(accountId, clock.millis() - startTime, MetricName.err);
691+
}
692+
return failResponse(exception);
693+
}
694+
695+
private <T> Future<T> failVtrackCacheReadResponse(Throwable exception, long startTime) {
696+
if (exception instanceof PreBidException) {
697+
metrics.updateVtrackCacheReadRequestTime(clock.millis() - startTime, MetricName.err);
698+
}
699+
return failResponse(exception);
700+
}
701+
696702
private static <T> Future<T> failResponse(Throwable exception) {
697703
logger.warn("Error occurred while interacting with cache service: {}", exception.getMessage());
698704
logger.debug("Error occurred while interacting with cache service", exception);
Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
package org.prebid.server.metric;
22

33
import com.codahale.metrics.MetricRegistry;
4+
import org.prebid.server.metric.model.CacheCreativeType;
45

56
import java.util.Objects;
67
import java.util.function.Function;
78

89
public class CacheCreativeSizeMetrics extends UpdatableMetrics {
910

10-
CacheCreativeSizeMetrics(MetricRegistry metricRegistry, CounterType counterType, String prefix) {
11+
CacheCreativeSizeMetrics(MetricRegistry metricRegistry,
12+
CounterType counterType,
13+
String prefix,
14+
CacheCreativeType type) {
15+
1116
super(Objects.requireNonNull(metricRegistry), Objects.requireNonNull(counterType),
12-
nameCreator(Objects.requireNonNull(prefix)));
17+
nameCreator(Objects.requireNonNull(prefix), Objects.requireNonNull(type)));
1318
}
1419

15-
private static Function<MetricName, String> nameCreator(String prefix) {
16-
return metricName -> "%s.creative_size.%s".formatted(prefix, metricName);
20+
private static Function<MetricName, String> nameCreator(String prefix, CacheCreativeType type) {
21+
return metricName -> "%s.%s_size.%s".formatted(prefix, type.getType(), metricName);
1722
}
1823
}
Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
package org.prebid.server.metric;
22

33
import com.codahale.metrics.MetricRegistry;
4+
import org.prebid.server.metric.model.CacheCreativeType;
45

56
import java.util.Objects;
67
import java.util.function.Function;
78

89
public class CacheCreativeTtlMetrics extends UpdatableMetrics {
910

10-
CacheCreativeTtlMetrics(MetricRegistry metricRegistry, CounterType counterType, String prefix) {
11+
CacheCreativeTtlMetrics(MetricRegistry metricRegistry,
12+
CounterType counterType,
13+
String prefix,
14+
CacheCreativeType type) {
15+
1116
super(Objects.requireNonNull(metricRegistry),
1217
Objects.requireNonNull(counterType),
13-
nameCreator(Objects.requireNonNull(prefix)));
18+
nameCreator(Objects.requireNonNull(prefix), Objects.requireNonNull(type)));
1419
}
1520

16-
private static Function<MetricName, String> nameCreator(String prefix) {
17-
return metricName -> "%s.creative_ttl.%s".formatted(prefix, metricName);
21+
private static Function<MetricName, String> nameCreator(String prefix, CacheCreativeType type) {
22+
return metricName -> "%s.%s_ttl.%s".formatted(prefix, type.getType(), metricName);
1823
}
1924
}

src/main/java/org/prebid/server/metric/CacheMetrics.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package org.prebid.server.metric;
22

33
import com.codahale.metrics.MetricRegistry;
4+
import org.prebid.server.metric.model.CacheCreativeType;
45

6+
import java.util.HashMap;
7+
import java.util.Map;
58
import java.util.Objects;
69
import java.util.function.Function;
710

@@ -14,6 +17,8 @@ class CacheMetrics extends UpdatableMetrics {
1417
private final CacheCreativeSizeMetrics cacheCreativeSizeMetrics;
1518
private final CacheCreativeTtlMetrics cacheCreativeTtlMetrics;
1619
private final CacheVtrackMetrics cacheVtrackMetrics;
20+
private final Map<String, CacheModuleStorageMetrics> cacheModuleStorageMetrics;
21+
private final Function<String, CacheModuleStorageMetrics> cacheModuleStorageMetricsCreator;
1722

1823
CacheMetrics(MetricRegistry metricRegistry, CounterType counterType) {
1924
super(
@@ -22,9 +27,14 @@ class CacheMetrics extends UpdatableMetrics {
2227
nameCreator(createPrefix()));
2328

2429
requestsMetrics = new RequestMetrics(metricRegistry, counterType, createPrefix());
25-
cacheCreativeSizeMetrics = new CacheCreativeSizeMetrics(metricRegistry, counterType, createPrefix());
26-
cacheCreativeTtlMetrics = new CacheCreativeTtlMetrics(metricRegistry, counterType, createPrefix());
30+
cacheCreativeSizeMetrics = new CacheCreativeSizeMetrics(
31+
metricRegistry, counterType, createPrefix(), CacheCreativeType.CREATIVE);
32+
cacheCreativeTtlMetrics = new CacheCreativeTtlMetrics(
33+
metricRegistry, counterType, createPrefix(), CacheCreativeType.CREATIVE);
2734
cacheVtrackMetrics = new CacheVtrackMetrics(metricRegistry, counterType, createPrefix());
35+
cacheModuleStorageMetrics = new HashMap<>();
36+
cacheModuleStorageMetricsCreator = moduleCode ->
37+
new CacheModuleStorageMetrics(metricRegistry, counterType, createPrefix(), moduleCode);
2838
}
2939

3040
CacheMetrics(MetricRegistry metricRegistry, CounterType counterType, String prefix) {
@@ -34,9 +44,14 @@ class CacheMetrics extends UpdatableMetrics {
3444
nameCreator(createPrefix(Objects.requireNonNull(prefix))));
3545

3646
requestsMetrics = new RequestMetrics(metricRegistry, counterType, createPrefix(prefix));
37-
cacheCreativeSizeMetrics = new CacheCreativeSizeMetrics(metricRegistry, counterType, createPrefix(prefix));
38-
cacheCreativeTtlMetrics = new CacheCreativeTtlMetrics(metricRegistry, counterType, createPrefix(prefix));
47+
cacheCreativeSizeMetrics = new CacheCreativeSizeMetrics(
48+
metricRegistry, counterType, createPrefix(prefix), CacheCreativeType.CREATIVE);
49+
cacheCreativeTtlMetrics = new CacheCreativeTtlMetrics(
50+
metricRegistry, counterType, createPrefix(prefix), CacheCreativeType.CREATIVE);
3951
cacheVtrackMetrics = new CacheVtrackMetrics(metricRegistry, counterType, createPrefix(prefix));
52+
cacheModuleStorageMetrics = new HashMap<>();
53+
cacheModuleStorageMetricsCreator = moduleCode ->
54+
new CacheModuleStorageMetrics(metricRegistry, counterType, createPrefix(), moduleCode);
4055
}
4156

4257
private static String createPrefix(String prefix) {
@@ -66,4 +81,8 @@ CacheCreativeTtlMetrics creativeTtl() {
6681
CacheVtrackMetrics vtrack() {
6782
return cacheVtrackMetrics;
6883
}
84+
85+
CacheModuleStorageMetrics moduleStorage(String moduleCode) {
86+
return cacheModuleStorageMetrics.computeIfAbsent(moduleCode, cacheModuleStorageMetricsCreator);
87+
}
6988
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.prebid.server.metric;
2+
3+
import com.codahale.metrics.MetricRegistry;
4+
import org.prebid.server.metric.model.CacheCreativeType;
5+
6+
import java.util.Objects;
7+
import java.util.function.Function;
8+
9+
class CacheModuleStorageMetrics extends UpdatableMetrics {
10+
11+
private final CacheReadMetrics readMetrics;
12+
private final CacheWriteMetrics writeMetrics;
13+
private final CacheCreativeSizeMetrics entrySizeMetrics;
14+
private final CacheCreativeTtlMetrics entryTtlMetrics;
15+
16+
CacheModuleStorageMetrics(MetricRegistry metricRegistry, CounterType counterType, String prefix, String module) {
17+
super(
18+
Objects.requireNonNull(metricRegistry),
19+
Objects.requireNonNull(counterType),
20+
nameCreator(createPrefix(Objects.requireNonNull(prefix), Objects.requireNonNull(module))));
21+
22+
readMetrics = new CacheReadMetrics(metricRegistry, counterType, createPrefix(prefix, module));
23+
writeMetrics = new CacheWriteMetrics(metricRegistry, counterType, createPrefix(prefix, module));
24+
entrySizeMetrics = new CacheCreativeSizeMetrics(
25+
metricRegistry, counterType, createPrefix(prefix, module), CacheCreativeType.ENTRY);
26+
entryTtlMetrics = new CacheCreativeTtlMetrics(
27+
metricRegistry, counterType, createPrefix(prefix, module), CacheCreativeType.ENTRY);
28+
}
29+
30+
private static Function<MetricName, String> nameCreator(String prefix) {
31+
return metricName -> "%s.%s".formatted(prefix, metricName);
32+
}
33+
34+
private static String createPrefix(String prefix, String moduleCode) {
35+
return "%s.module_storage.%s".formatted(prefix, moduleCode);
36+
}
37+
38+
CacheReadMetrics read() {
39+
return readMetrics;
40+
}
41+
42+
CacheWriteMetrics write() {
43+
return writeMetrics;
44+
}
45+
46+
CacheCreativeSizeMetrics entrySize() {
47+
return entrySizeMetrics;
48+
}
49+
50+
CacheCreativeTtlMetrics entryTtl() {
51+
return entryTtlMetrics;
52+
}
53+
54+
}

0 commit comments

Comments
 (0)