/
NewRelicResourceFilterFactory.java
72 lines (59 loc) · 2.66 KB
/
NewRelicResourceFilterFactory.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package com.palominolabs.jersey.newrelic;
/*
* Copyright (c) 2012 Palomino Labs, Inc.
*/
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.sun.jersey.api.model.AbstractMethod;
import com.sun.jersey.api.model.AbstractResourceMethod;
import com.sun.jersey.api.model.AbstractSubResourceLocator;
import com.sun.jersey.core.util.FeaturesAndProperties;
import com.sun.jersey.spi.container.ResourceFilter;
import com.sun.jersey.spi.container.ResourceFilterFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* Adds resource filters to integrate New Relic into the Jersey invocation stack.
*/
@Singleton
public final class NewRelicResourceFilterFactory implements ResourceFilterFactory {
private static final Logger logger = LoggerFactory.getLogger(NewRelicResourceFilterFactory.class);
/**
* Jersey property to set to control transaction category name. Leave unset to use the New Relic default.
*/
public static final String TRANSACTION_CATEGORY_PROP = "com.palominolabs.jersey.newrelic.transaction.category";
private final ResourceTransactionNamer namer;
private final String category;
private final NewRelicWrapper newRelicWrapper;
@Inject
NewRelicResourceFilterFactory(ResourceTransactionNamer namer, FeaturesAndProperties featuresAndProperties,
NewRelicWrapper newRelicWrapper) {
this.namer = namer;
this.newRelicWrapper = newRelicWrapper;
Map<String, Object> props = featuresAndProperties.getProperties();
if (props.containsKey(TRANSACTION_CATEGORY_PROP)) {
this.category = (String) props.get(TRANSACTION_CATEGORY_PROP);
} else {
this.category = null;
}
}
@Override
public List<ResourceFilter> create(AbstractMethod am) {
// documented to only be AbstractSubResourceLocator, AbstractResourceMethod, or AbstractSubResourceMethod
if (am instanceof AbstractSubResourceLocator) {
// not actually invoked per request, nothing to do
logger.debug("Ignoring AbstractSubResourceLocator " + am);
return null;
} else if (am instanceof AbstractResourceMethod) {
String transactionName = namer.getTransactionName((AbstractResourceMethod) am);
return Arrays.asList(new NewRelicTransactionNameResourceFilter(newRelicWrapper, category, transactionName),
new NewRelicMappedThrowableResourceFilter(newRelicWrapper));
} else {
logger.warn("Got an unexpected instance of " + am.getClass().getName() + ": " + am);
return null;
}
}
}