@Nullable @Override public Result apply(@Nullable Result input) { if (input == null) { return null; } return new Result( input.getEpoch(), input.getAttributeName(), input.getClassName(), input.getObjDomain(), input.getKeyAlias(), input.getTypeName(), input.getValuePath(), valueTransformer.apply(input.getValue()) ); }
public static String getValueKey(Result result) { if (result.getValuePath().isEmpty()) { return result.getAttributeName(); } return result.getAttributeName() + "." + getValuePathString(result); }
@Override public String formatName(Result result) { StringBuilder formatted = new StringBuilder(); String attName = result.getAttributeName(); String className = result.getKeyAlias(); if (className == null) className = result.getClassName(); formatted.append(className); formatted.append(delimiter); formatted.append(attName); return formatted.toString(); } }
resultIndex++; String bucketType = getBucketType(resultIndex); String attributeName = result.getAttributeName(); if (isNotValidValue(result.getValue())) { log.debug("Skipping message key[{}] with value: {}.", result.getAttributeName(), result.getValue()); continue; if( !result.getValuePath().isEmpty() ){ tagList.add("resultKey="+ KeyUtils.getValuePathString(result)); Number actualValue = computeActualValue(result.getValue()); StringBuilder sb = new StringBuilder(result.getKeyAlias()) .append(StringUtils.join(tagList, ",")) .append(":").append(actualValue)
@Override public void write( @Nonnull Writer writer, @Nonnull Server server, @Nonnull Query query, @Nonnull Iterable<Result> results) throws IOException { for (Result result : results) { log.debug("Query result: {}", result); Object value = result.getValue(); if (isValidNumber(value)) { String line = KeyUtils.getKeyString(server, query, result, typeNames, rootPrefix) .replaceAll("[()]", "_") + " " + value.toString() + " " + SECONDS.convert(result.getEpoch(), MILLISECONDS) + "\n"; log.debug("Graphite Message: {}", line); writer.write(line); } else { onlyOnceLogger.infoOnce("Unable to submit non-numeric value to Graphite: [{}] from result [{}]", value, result); } } } }
if (isNumeric(metric.getValue())) { if (!metric.getKeyAlias().isEmpty()) { nameBuilder.append(metric.getKeyAlias()); nameBuilder.append(metric.getClassName()); TypeNameValuesStringBuilder.getDefaultBuilder().build(typeNames, metric.getTypeName())); if (typeName != null && typeName.length() > 0) { nameBuilder.append("."); if (metric.getValue() instanceof Float && ((Float) metric.getValue()).isNaN()) { logger.info("Metric value for " + nameBuilder.toString() + " is NaN, skipping"); continue; if (metric.getValue() instanceof Double && ((Double) metric.getValue()).isNaN()) { logger.info("Metric value for " + nameBuilder.toString() + " is NaN, skipping"); continue; g.writeNumberField("value", Double.valueOf(metric.getValue().toString())); g.writeStringField("instance", instanceId); g.writeNumberField("collected_at", metric.getEpoch() / 1000); g.writeEndObject();
private void doGenerate(List<Result> results) throws Exception { if (isDebugEnabled() && generate) { StringBuilder sb = new StringBuilder("\n"); List<String> keys = new ArrayList<>(); for (Result res : results) { if (isNumeric(res.getValue())) { String key = getDataSourceName(getConcatedTypeNameValues(res.getTypeName()), res.getAttributeName(), res.getValuePath()); if (keys.contains(key)) { throw new Exception("Duplicate datasource name found: '" + key + "'. Please try to add more typeName keys to the writer to make the name more unique. " + res.toString()); } keys.add(key); sb.append("<datasource><!-- ").append(res.getTypeName()).append(":") .append(res.getAttributeName()).append(":").append(res.getValuePath()) .append(" --><name>").append(key) .append("</name><type>GAUGE</type><heartbeat>400</heartbeat><min>U</min><max>U</max></datasource>\n"); } } log.debug(sb.toString()); } }
@Override public void doWrite(Query query) throws Exception { for (Result result : query.getResults()) { Map<String, Object> resultValues = result.getValues(); if (resultValues != null) { for (Map.Entry<String, Object> values : resultValues.entrySet()) { writer.append(", \"seq\" : " + SEQUENCE_COUNTER.incrementAndGet()); writer.append(", \"timestamp\" : "); quote(formatDate(result.getEpoch()), writer); writer.append(", \"object\" : "); quote(query.getObj(), writer); writer.append(", \"attribute\" : "); quote(result.getAttributeName(), writer); writer.append(", \"class\" : "); quote(result.getClassName(), writer); writer.append(", \"alias\" : "); quote(result.getClassNameAlias(), writer); writer.append(", \"type\" : "); quote(result.getTypeName(), writer); writer.append(", \"key\" : "); quote(values.getKey(), writer);
@Override public String serialize(Server server, Query query, Result result) throws IOException { log.debug("Query result: [{}]", result); Object value = result.getValue(); if (!isNumeric(value)) { log.warn("Unable to submit non-numeric value to Kafka: [{}] from result [{}]", value, result); return null; } return createJsonMessage(server, query, result, result.getValuePath(), value); }
private MetricDatum processResult(Result result) { // Sometimes the attribute name and the key of the value are the same MetricDatum metricDatum = new MetricDatum(); if (result.getValuePath().isEmpty()) { metricDatum.setMetricName(result.getAttributeName()); } else { metricDatum.setMetricName(result.getAttributeName() + "_" + KeyUtils.getValuePathString(result)); } metricDatum.setDimensions(dimensions); // Converts the Objects to Double-values for CloudWatch metricDatum.setValue(toDoubleConverter.apply(result.getValue())); metricDatum.setTimestamp(new Date()); return metricDatum; }
/** * Populate the context with values from the result. * * @param context - the expression context used when evaluating JEXL expressions. * @param result - the result of a JMX query. */ protected void populateContext(JexlContext context, Result result) { context.set(VAR_CLASSNAME, result.getClassName()); context.set(VAR_ATTRIBUTE_NAME, result.getAttributeName()); context.set(VAR_CLASSNAME_ALIAS, result.getKeyAlias()); Map<String, String> typeNameMap = TypeNameValue.extractMap(result.getTypeName()); context.set(VAR_TYPENAME, typeNameMap); String effectiveClassname = result.getKeyAlias(); if (effectiveClassname == null) { effectiveClassname = result.getClassName(); } context.set(VAR_EFFECTIVE_CLASSNAME, effectiveClassname); context.set(VAR_RESULT, result); } }
Object value = result.getValue(); filteredValues.put(JMX_PORT_KEY, Integer.parseInt(server.getPort())); Point point = Point.measurement(result.getKeyAlias()).time(result.getEpoch(), MILLISECONDS) .tag(resultTagsToApply).fields(filteredValues).build();
@Override public String serialize(Server server, Query query, Result result) { return isNumeric(result.getValue()) ? "" : null; } };
public static String getKeyString2(Query query, Result result, Entry<String, Object> values, List<String> typeNames, String rootPrefix) { String keyStr = null; if (values.getKey().startsWith(result.getAttributeName())) { keyStr = values.getKey(); } else { keyStr = result.getAttributeName() + "." + values.getKey(); } StringBuilder sb = new StringBuilder(); // Allow people to use something other than the classname as the output. if (result.getClassNameAlias() != null) { sb.append(result.getClassNameAlias()); } else { sb.append(cleanupStr(result.getClassName())); } sb.append("."); String typeName = cleanupStr(getConcatedTypeNameValues(query, typeNames, result.getTypeName())); if (typeName != null) { sb.append(typeName); sb.append("."); } sb.append(cleanupStr(keyStr)); return sb.toString(); }
@Override public void internalWrite(Server server, Query query, ImmutableList<Result> results) throws Exception { List<String> typeNames = this.getTypeNames(); for (Result result : results) { log.debug(result.toString()); String key = KeyUtils.getKeyString(server, query, result, typeNames, rootPrefix); if (isNotValidValue(result.getValue())) { log.debug("Skipping message key[{}] with value: {}.", key, result.getValue()); continue; } // These characters can mess with formatting. String line = STATSD_INVALID.matcher(key).replaceAll(this.replacementForInvalidChar) + computeActualValue(result.getValue()) + "|" + bucketType + "\n"; doSend(line.trim()); } }
/** * Adds a key to the StringBuilder * * It uses in order of preference: * * 1. resultAlias if that was specified as part of the query * 2. The domain portion of the ObjectName in the query if useObjDomainAsKey is set to true * 3. else, the Class Name of the MBean. I.e. ClassName will be used by default if the * user doesn't specify anything special * @param query * @param result * @param sb */ private static void addMBeanIdentifier(Query query, Result result, StringBuilder sb) { if (result.getKeyAlias() != null) { sb.append(result.getKeyAlias()); } else if (query.isUseObjDomainAsKey()) { sb.append(StringUtils.cleanupStr(result.getObjDomain(), query.isAllowDottedKeys())); } else { sb.append(StringUtils.cleanupStr(result.getClassName())); } }
@Override public String get(Result result) { return result.getTypeName(); } };
private String createJsonMessage(Server server, Query query, Result result, List<String> valuePath, Object value) throws IOException { String keyString = getKeyString(server, query, result, typeNames, this.rootPrefix); String cleanKeyString = keyString.replaceAll("[()]", "_"); try ( ByteArrayOutputStream out = new ByteArrayOutputStream(); JsonGenerator generator = jsonFactory.createGenerator(out, UTF8) ) { generator.writeStartObject(); generator.writeStringField("keyspace", cleanKeyString); generator.writeStringField("value", value.toString()); generator.writeNumberField("timestamp", result.getEpoch() / 1000); generator.writeObjectFieldStart("tags"); for (Map.Entry<String, String> tag : this.tags.entrySet()) { generator.writeStringField(tag.getKey(), tag.getValue()); } for (ResultAttribute resultAttribute : this.resultAttributesToWriteAsTags) { generator.writeStringField(resultAttribute.getName(), resultAttribute.get(result)); } generator.writeEndObject(); generator.writeEndObject(); generator.close(); return out.toString("UTF-8"); } } }
@Override public String get(Result result) { return result.getAttributeName(); } };
public static String getValuePathString(Result result) { return Joiner.on('.').join(result.getValuePath()); }