Search in sources :

Example 11 with Result

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);
}
Also used : ServerFixtures.dummyServer(com.googlecode.jmxtrans.model.ServerFixtures.dummyServer) Server(com.googlecode.jmxtrans.model.Server) QueryFixtures.dummyQuery(com.googlecode.jmxtrans.model.QueryFixtures.dummyQuery) Query(com.googlecode.jmxtrans.model.Query) OutputWriter(com.googlecode.jmxtrans.model.OutputWriter) Result(com.googlecode.jmxtrans.model.Result) ResultFixtures.singleTrueResult(com.googlecode.jmxtrans.model.ResultFixtures.singleTrueResult) ResultFixtures.singleFalseResult(com.googlecode.jmxtrans.model.ResultFixtures.singleFalseResult) Test(org.junit.Test)

Example 12 with Result

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 ");
}
Also used : ServerFixtures.dummyServer(com.googlecode.jmxtrans.model.ServerFixtures.dummyServer) Server(com.googlecode.jmxtrans.model.Server) QueryFixtures.dummyQuery(com.googlecode.jmxtrans.model.QueryFixtures.dummyQuery) Query(com.googlecode.jmxtrans.model.Query) ServerFixtures.serverWithNoQuery(com.googlecode.jmxtrans.model.ServerFixtures.serverWithNoQuery) ArrayList(java.util.ArrayList) ByteArrayOutputStream(java.io.ByteArrayOutputStream) Result(com.googlecode.jmxtrans.model.Result) ResultFixtures.singleTrueResult(com.googlecode.jmxtrans.model.ResultFixtures.singleTrueResult) ResultFixtures.numericResult(com.googlecode.jmxtrans.model.ResultFixtures.numericResult) ResultFixtures.stringResult(com.googlecode.jmxtrans.model.ResultFixtures.stringResult) Test(org.junit.Test)

Example 13 with Result

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();
    }
}
Also used : Closer(com.google.common.io.Closer) Result(com.googlecode.jmxtrans.model.Result) JsonGenerator(com.fasterxml.jackson.core.JsonGenerator) Map(java.util.Map)

Example 14 with Result

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();
}
Also used : JsonGenerator(com.fasterxml.jackson.core.JsonGenerator) ToString(lombok.ToString) Map(java.util.Map) Result(com.googlecode.jmxtrans.model.Result)

Example 15 with Result

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;
    }
}
Also used : TypeNameValuesStringBuilder(com.googlecode.jmxtrans.model.naming.typename.TypeNameValuesStringBuilder) ToString(lombok.ToString) Result(com.googlecode.jmxtrans.model.Result) StringWriter(java.io.StringWriter) JsonGenerator(com.fasterxml.jackson.core.JsonGenerator) StringWriter(java.io.StringWriter) Writer(java.io.Writer)

Aggregations

Result (com.googlecode.jmxtrans.model.Result)38 Test (org.junit.Test)17 JmxResultProcessor (com.googlecode.jmxtrans.model.JmxResultProcessor)9 ObjectInstance (javax.management.ObjectInstance)9 Query (com.googlecode.jmxtrans.model.Query)8 Map (java.util.Map)8 Server (com.googlecode.jmxtrans.model.Server)7 Attribute (javax.management.Attribute)6 JsonGenerator (com.fasterxml.jackson.core.JsonGenerator)4 ServerFixtures.dummyServer (com.googlecode.jmxtrans.model.ServerFixtures.dummyServer)4 JestResult (io.searchbox.client.JestResult)4 ToString (lombok.ToString)4 OutputWriter (com.googlecode.jmxtrans.model.OutputWriter)3 QueryFixtures.dummyQuery (com.googlecode.jmxtrans.model.QueryFixtures.dummyQuery)3 ResultFixtures.singleTrueResult (com.googlecode.jmxtrans.model.ResultFixtures.singleTrueResult)3 DocumentResult (io.searchbox.core.DocumentResult)3 ArrayList (java.util.ArrayList)3 AttributeList (javax.management.AttributeList)3 ImmutableList (com.google.common.collect.ImmutableList)2 ImmutableMap (com.google.common.collect.ImmutableMap)2