View | Details | Raw Unified | Return to bug 57351
Collapse All | Expand All

(-)src/components/org/apache/jmeter/visualizers/backend/graphite/GraphiteBackendListenerClient.java (-22 / +27 lines)
Lines 44-50 Link Here
44
 * @since 2.13
44
 * @since 2.13
45
 */
45
 */
46
public class GraphiteBackendListenerClient extends AbstractBackendListenerClient implements Runnable {
46
public class GraphiteBackendListenerClient extends AbstractBackendListenerClient implements Runnable {
47
    private static final int DEFAULT_PICKLE_PORT = 2004;
47
    private static final int DEFAULT_PLAINTEXT_PROTOCOL_PORT = 2003;
48
    private static final String CUMULATED_CONTEXT_NAME = "cumulated";
48
    private static final String CUMULATED_CONTEXT_NAME = "cumulated";
49
49
50
    private static final Logger LOGGER = LoggingManager.getLoggerForClass();
50
    private static final Logger LOGGER = LoggingManager.getLoggerForClass();
Lines 76-82 Link Here
76
    private Map<String, Float> percentiles;
76
    private Map<String, Float> percentiles;
77
    
77
    
78
78
79
    private GraphiteMetricsSender pickleMetricsManager;
79
    private GraphiteMetricsSender graphiteMetricsManager;
80
80
81
    private ScheduledExecutorService scheduler;
81
    private ScheduledExecutorService scheduler;
82
    private ScheduledFuture<?> timerHandle;
82
    private ScheduledFuture<?> timerHandle;
Lines 108-138 Link Here
108
                metric.resetForTimeInterval();
108
                metric.resetForTimeInterval();
109
            }
109
            }
110
        }        
110
        }        
111
        pickleMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_MIN_ACTIVE_THREADS, Integer.toString(getUserMetrics().getMaxActiveThreads()));
111
        graphiteMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_MIN_ACTIVE_THREADS, Integer.toString(getUserMetrics().getMaxActiveThreads()));
112
        pickleMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_MAX_ACTIVE_THREADS, Integer.toString(getUserMetrics().getMinActiveThreads()));
112
        graphiteMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_MAX_ACTIVE_THREADS, Integer.toString(getUserMetrics().getMinActiveThreads()));
113
        pickleMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_MEAN_ACTIVE_THREADS, Integer.toString(getUserMetrics().getMeanActiveThreads()));
113
        graphiteMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_MEAN_ACTIVE_THREADS, Integer.toString(getUserMetrics().getMeanActiveThreads()));
114
        pickleMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_STARTED_THREADS, Integer.toString(getUserMetrics().getStartedThreads()));
114
        graphiteMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_STARTED_THREADS, Integer.toString(getUserMetrics().getStartedThreads()));
115
        pickleMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_STOPPED_THREADS, Integer.toString(getUserMetrics().getFinishedThreads()));
115
        graphiteMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_STOPPED_THREADS, Integer.toString(getUserMetrics().getFinishedThreads()));
116
116
117
        pickleMetricsManager.writeAndSendMetrics();
117
        graphiteMetricsManager.writeAndSendMetrics();
118
    }
118
    }
119
119
120
120
121
    /**
121
    /**
122
     * Add request metrics to metrics manager.
123
     * Note if total number of requests is 0, no response time metrics are sent.
122
     * @param timestampInSeconds long
124
     * @param timestampInSeconds long
123
     * @param contextName String
125
     * @param contextName String
124
     * @param metric {@link SamplerMetric}
126
     * @param metric {@link SamplerMetric}
125
     */
127
     */
126
    private void addMetrics(long timestampInSeconds, String contextName, SamplerMetric metric) {
128
    private void addMetrics(long timestampInSeconds, String contextName, SamplerMetric metric) {
127
        pickleMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_FAILED_REQUESTS, Integer.toString(metric.getFailures()));
129
        graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_FAILED_REQUESTS, Integer.toString(metric.getFailures()));
128
        pickleMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_SUCCESSFUL_REQUESTS, Integer.toString(metric.getSuccesses()));
130
        graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_SUCCESSFUL_REQUESTS, Integer.toString(metric.getSuccesses()));
129
        pickleMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_TOTAL_REQUESTS, Integer.toString(metric.getTotal()));
131
        graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_TOTAL_REQUESTS, Integer.toString(metric.getTotal()));
130
        pickleMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_MIN_RESPONSE_TIME, Double.toString(metric.getMinTime()));
132
        // See https://issues.apache.org/bugzilla/show_bug.cgi?id=57350
131
        pickleMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_MAX_RESPONSE_TIME, Double.toString(metric.getMaxTime()));
133
        if(metric.getTotal() > 0) { 
132
        for (Map.Entry<String, Float> entry : percentiles.entrySet()) {
134
            graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_MIN_RESPONSE_TIME, Double.toString(metric.getMinTime()));
133
            pickleMetricsManager.addMetric(timestampInSeconds, contextName, 
135
            graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_MAX_RESPONSE_TIME, Double.toString(metric.getMaxTime()));
134
                    entry.getKey(), 
136
            for (Map.Entry<String, Float> entry : percentiles.entrySet()) {
135
                    Double.toString(metric.getPercentile(entry.getValue().floatValue())));            
137
                graphiteMetricsManager.addMetric(timestampInSeconds, contextName, 
138
                        entry.getKey(), 
139
                        Double.toString(metric.getPercentile(entry.getValue().floatValue())));            
140
            }
136
        }
141
        }
137
    }
142
    }
138
143
Lines 171-177 Link Here
171
        String graphiteMetricsSenderClass = context.getParameter("graphiteMetricsSender");
176
        String graphiteMetricsSenderClass = context.getParameter("graphiteMetricsSender");
172
        
177
        
173
        graphiteHost = context.getParameter("graphiteHost");
178
        graphiteHost = context.getParameter("graphiteHost");
174
        graphitePort = context.getIntParameter("graphitePort", DEFAULT_PICKLE_PORT);
179
        graphitePort = context.getIntParameter("graphitePort", DEFAULT_PLAINTEXT_PROTOCOL_PORT);
175
        summaryOnly = context.getBooleanParameter("summaryOnly", true);
180
        summaryOnly = context.getBooleanParameter("summaryOnly", true);
176
        samplersList = context.getParameter("samplersList", "");
181
        samplersList = context.getParameter("samplersList", "");
177
        rootMetricsPrefix = context.getParameter("rootMetricsPrefix", DEFAULT_METRICS_PREFIX);
182
        rootMetricsPrefix = context.getParameter("rootMetricsPrefix", DEFAULT_METRICS_PREFIX);
Lines 192-199 Link Here
192
            }
197
            }
193
        }
198
        }
194
        Class<?> clazz = Class.forName(graphiteMetricsSenderClass);
199
        Class<?> clazz = Class.forName(graphiteMetricsSenderClass);
195
        this.pickleMetricsManager = (GraphiteMetricsSender) clazz.newInstance();
200
        this.graphiteMetricsManager = (GraphiteMetricsSender) clazz.newInstance();
196
        pickleMetricsManager.setup(graphiteHost, graphitePort, rootMetricsPrefix);
201
        graphiteMetricsManager.setup(graphiteHost, graphitePort, rootMetricsPrefix);
197
        String[] samplers = samplersList.split(SEPARATOR);
202
        String[] samplers = samplersList.split(SEPARATOR);
198
        samplersToFilter = new HashSet<String>();
203
        samplersToFilter = new HashSet<String>();
199
        for (String samplerName : samplers) {
204
        for (String samplerName : samplers) {
Lines 220-226 Link Here
220
        sendMetrics();
225
        sendMetrics();
221
        
226
        
222
        samplersToFilter.clear();
227
        samplersToFilter.clear();
223
        pickleMetricsManager.destroy();
228
        graphiteMetricsManager.destroy();
224
        super.teardownTest(context);
229
        super.teardownTest(context);
225
    }
230
    }
226
231
Lines 229-235 Link Here
229
        Arguments arguments = new Arguments();
234
        Arguments arguments = new Arguments();
230
        arguments.addArgument("graphiteMetricsSender", TextGraphiteMetricsSender.class.getName());
235
        arguments.addArgument("graphiteMetricsSender", TextGraphiteMetricsSender.class.getName());
231
        arguments.addArgument("graphiteHost", "");
236
        arguments.addArgument("graphiteHost", "");
232
        arguments.addArgument("graphitePort", Integer.toString(DEFAULT_PICKLE_PORT));
237
        arguments.addArgument("graphitePort", Integer.toString(DEFAULT_PLAINTEXT_PROTOCOL_PORT));
233
        arguments.addArgument("rootMetricsPrefix", DEFAULT_METRICS_PREFIX);
238
        arguments.addArgument("rootMetricsPrefix", DEFAULT_METRICS_PREFIX);
234
        arguments.addArgument("summaryOnly", "true");
239
        arguments.addArgument("summaryOnly", "true");
235
        arguments.addArgument("samplersList", "");
240
        arguments.addArgument("samplersList", "");
(-)xdocs/usermanual/component_reference.xml (-3 / +3 lines)
Lines 3408-3416 Link Here
3408
3408
3409
    <properties>
3409
    <properties>
3410
        <property name="graphiteMetricsSender" required="Yes">org.apache.jmeter.visualizers.backend.graphite.TextGraphiteMetricsSender or org.apache.jmeter.visualizers.backend.graphite.PickleGraphiteMetricsSender</property>
3410
        <property name="graphiteMetricsSender" required="Yes">org.apache.jmeter.visualizers.backend.graphite.TextGraphiteMetricsSender or org.apache.jmeter.visualizers.backend.graphite.PickleGraphiteMetricsSender</property>
3411
        <property name="graphiteHost" required="Yes">Graphite or InfluxDB or CollectD server port</property>
3411
        <property name="graphiteHost" required="Yes">Graphite or InfluxDB (with Graphite plugin enabled) or CollectD (with Graphite plugin enabled) server port</property>
3412
        <property name="graphitePort" required="Yes">Graphite or InfluxDB or CollectD server port, defaults to 2003. Note PickleGraphiteMetricsSender can only talk to Graphite server.</property>
3412
        <property name="graphitePort" required="Yes">Graphite or InfluxDB (with Graphite plugin enabled) or CollectD (with Graphite plugin enabled) server port, defaults to 2003. Note PickleGraphiteMetricsSender (port 2004) can only talk to Graphite server.</property>
3413
        <property name="rootMetricsPrefix" required="Yes">Prefix of metrics sent to backend. Defaults to ""jmeter."</property>
3413
        <property name="rootMetricsPrefix" required="Yes">Prefix of metrics sent to backend. Defaults to "jmeter."</property>
3414
        <property name="summaryOnly" required="Yes">Only send a summary with no detail. Defaults to true.</property>
3414
        <property name="summaryOnly" required="Yes">Only send a summary with no detail. Defaults to true.</property>
3415
        <property name="samplersList" required="Yes">Semicolon separated list of samplers for which you want to report metrics to backend.</property>
3415
        <property name="samplersList" required="Yes">Semicolon separated list of samplers for which you want to report metrics to backend.</property>
3416
        <property name="percentiles" required="Yes">The percentiles you want to send to backend. List must be semicolon separated.</property>
3416
        <property name="percentiles" required="Yes">The percentiles you want to send to backend. List must be semicolon separated.</property>

Return to bug 57351