use of com.googlecode.jmxtrans.model.Result in project jmxtrans by jmxtrans.
the class ResultTransformerOutputWriterTest method identityTransformerDoesNotTransformValues.
@Test
public void identityTransformerDoesNotTransformValues() throws Exception {
ResultTransformerOutputWriter<OutputWriter> resultTransformerOutputWriter = identity(outputWriter);
resultTransformerOutputWriter.doWrite(dummyServer(), dummyQuery(), singleFalseResult());
verify(outputWriter).doWrite(any(Server.class), any(Query.class), resultsCaptor.capture());
assertThat(resultsCaptor.getValue()).hasSize(1);
Result transformedResult = resultsCaptor.getValue().get(0);
assertThat(transformedResult.getValues()).containsEntry("Verbose", FALSE);
}
use of com.googlecode.jmxtrans.model.Result in project jmxtrans by jmxtrans.
the class GraphiteWriterTests method checkEmptyTypeNamesAreIgnored.
@Test
public void checkEmptyTypeNamesAreIgnored() throws Exception {
Server server = serverWithNoQuery();
// Set useObjDomain to true
Query query = Query.builder().setUseObjDomainAsKey(true).setAllowDottedKeys(true).setObj("\"yammer.metrics\":name=\"uniqueName\",type=\"\"").build();
Result result = new Result(System.currentTimeMillis(), "Attribute", "com.yammer.metrics.reporting.JmxReporter$Counter", "yammer.metrics", null, "name=\"uniqueName\",type=\"\"", ImmutableMap.of("Attribute", (Object) 0));
ByteArrayOutputStream out = new ByteArrayOutputStream();
ArrayList<String> typeNames = new ArrayList<String>();
typeNames.add("name");
typeNames.add("type");
GraphiteWriter writer = getGraphiteWriter(out, typeNames);
writer.doWrite(server, query, of(result));
// check that the empty type "type" is ignored when allowDottedKeys is true
assertThat(out.toString()).startsWith("servers.host_example_net_4321.yammer.metrics.uniqueName.Attribute 0 ");
// check that this also works when literal " characters aren't included in the JMX ObjectName
query = Query.builder().setUseObjDomainAsKey(true).setAllowDottedKeys(true).setObj("yammer.metrics:name=uniqueName,type=").build();
out = new ByteArrayOutputStream();
writer = getGraphiteWriter(out, typeNames);
writer.doWrite(server, query, of(result));
assertThat(out.toString()).startsWith("servers.host_example_net_4321.yammer.metrics.uniqueName.Attribute 0 ");
// check that the empty type "type" is ignored when allowDottedKeys is false
query = Query.builder().setUseObjDomainAsKey(true).setAllowDottedKeys(false).setObj("\"yammer.metrics\":name=\"uniqueName\",type=\"\"").build();
out = new ByteArrayOutputStream();
writer = getGraphiteWriter(out, typeNames);
writer.doWrite(server, query, of(result));
assertThat(out.toString()).startsWith("servers.host_example_net_4321.yammer_metrics.uniqueName.Attribute 0 ");
}
use of com.googlecode.jmxtrans.model.Result in project jmxtrans by jmxtrans.
the class LibratoWriter2 method write.
@Override
public void write(@Nonnull Writer writer, @Nonnull Server server, @Nonnull Query query, @Nonnull Iterable<Result> results) throws IOException {
Closer closer = Closer.create();
try {
JsonGenerator g = closer.register(jsonFactory.createGenerator(writer));
g.writeStartObject();
g.writeArrayFieldStart("counters");
g.writeEndArray();
String source = getSource(server);
g.writeArrayFieldStart("gauges");
for (Result result : results) {
Map<String, Object> resultValues = result.getValues();
for (Map.Entry<String, Object> values : resultValues.entrySet()) {
if (isNumeric(values.getValue())) {
g.writeStartObject();
g.writeStringField("name", KeyUtils.getKeyString(query, result, values, typeNames));
if (source != null && !source.isEmpty()) {
g.writeStringField("source", source);
}
g.writeNumberField("measure_time", SECONDS.convert(result.getEpoch(), MILLISECONDS));
Object value = values.getValue();
if (value instanceof Integer) {
g.writeNumberField("value", (Integer) value);
} else if (value instanceof Long) {
g.writeNumberField("value", (Long) value);
} else if (value instanceof Float) {
g.writeNumberField("value", (Float) value);
} else if (value instanceof Double) {
g.writeNumberField("value", (Double) value);
}
g.writeEndObject();
}
}
}
g.writeEndArray();
g.writeEndObject();
g.flush();
} catch (Throwable t) {
throw closer.rethrow(t);
} finally {
closer.close();
}
}
use of com.googlecode.jmxtrans.model.Result in project jmxtrans by jmxtrans.
the class SensuWriter method serialize.
private void serialize(Server server, Query query, List<Result> results, OutputStream outputStream) throws IOException {
JsonGenerator g = jsonFactory.createGenerator(outputStream, JsonEncoding.UTF8);
g.useDefaultPrettyPrinter();
g.writeStartObject();
g.writeStringField("name", "jmxtrans");
g.writeStringField("type", "metric");
g.writeStringField("handler", handler);
StringBuilder jsonoutput = new StringBuilder();
List<String> typeNames = getTypeNames();
for (Result result : results) {
for (Map.Entry<String, Object> values : result.getValues().entrySet()) {
if (isNumeric(values.getValue())) {
Object value = values.getValue();
jsonoutput.append(KeyUtils.getKeyString(server, query, result, values, typeNames, null)).append(" ").append(value).append(" ").append(TimeUnit.SECONDS.convert(result.getEpoch(), TimeUnit.MILLISECONDS)).append(System.getProperty("line.separator"));
}
}
}
g.writeStringField("output", jsonoutput.toString());
g.writeEndObject();
g.flush();
g.close();
}
use of com.googlecode.jmxtrans.model.Result in project jmxtrans by jmxtrans.
the class StackdriverWriter method getGatewayMessage.
/**
* Take query results, make a JSON String
*
* @param results List of Result objects
* @return a String containing a JSON message, or null if there are no values to report
*
* @throws IOException if there is some problem generating the JSON, should be uncommon
*/
private String getGatewayMessage(final List<Result> results) throws IOException {
int valueCount = 0;
Writer writer = new StringWriter();
JsonGenerator g = jsonFactory.createGenerator(writer);
g.writeStartObject();
g.writeNumberField("timestamp", System.currentTimeMillis() / 1000);
g.writeNumberField("proto_version", STACKDRIVER_PROTOCOL_VERSION);
g.writeArrayFieldStart("data");
List<String> typeNames = this.getTypeNames();
for (Result metric : results) {
Map<String, Object> values = metric.getValues();
if (values != null) {
for (Entry<String, Object> entry : values.entrySet()) {
if (isNumeric(entry.getValue())) {
// we have a numeric value, write a value into the message
StringBuilder nameBuilder = new StringBuilder();
// put the prefix if set
if (this.prefix != null) {
nameBuilder.append(prefix);
nameBuilder.append(".");
}
// put the class name or its alias if available
if (!metric.getKeyAlias().isEmpty()) {
nameBuilder.append(metric.getKeyAlias());
} else {
nameBuilder.append(metric.getClassName());
}
// Wildcard "typeNames" substitution
String typeName = com.googlecode.jmxtrans.model.naming.StringUtils.cleanupStr(TypeNameValuesStringBuilder.getDefaultBuilder().build(typeNames, metric.getTypeName()));
if (typeName != null && typeName.length() > 0) {
nameBuilder.append(".");
nameBuilder.append(typeName);
}
// add the attribute name
nameBuilder.append(".");
nameBuilder.append(metric.getAttributeName());
// put the value name if it differs from the attribute name
if (!entry.getKey().equals(metric.getAttributeName())) {
nameBuilder.append(".");
nameBuilder.append(entry.getKey());
}
// check for Float/Double NaN since these will cause the message validation to fail
if (entry.getValue() instanceof Float && ((Float) entry.getValue()).isNaN()) {
logger.info("Metric value for " + nameBuilder.toString() + " is NaN, skipping");
continue;
}
if (entry.getValue() instanceof Double && ((Double) entry.getValue()).isNaN()) {
logger.info("Metric value for " + nameBuilder.toString() + " is NaN, skipping");
continue;
}
valueCount++;
g.writeStartObject();
g.writeStringField("name", nameBuilder.toString());
g.writeNumberField("value", Double.valueOf(entry.getValue().toString()));
// if the metric is attached to an instance, include that in the message
if (instanceId != null && !instanceId.isEmpty()) {
g.writeStringField("instance", instanceId);
}
g.writeNumberField("collected_at", metric.getEpoch() / 1000);
g.writeEndObject();
}
}
}
}
g.writeEndArray();
g.writeEndObject();
g.flush();
g.close();
// return the message if there are any values to report
if (valueCount > 0) {
return writer.toString();
} else {
return null;
}
}
Aggregations