/** * Defines the TTL (time-to-live) that will be used when writing the data * from a tuple to HBase. After the TTL, the data will expire and will be * purged. * * @param tuple The tuple to map to HBase. * @return The TTL in milliseconds. */ @Override public Optional<Long> getTTL(Tuple tuple) { Optional<Long> expiresMillis = Optional.empty(); ProfileMeasurement measurement = (ProfileMeasurement) tuple.getValueByField("measurement"); ProfileConfig profileConfig = measurement.getDefinition(); if(profileConfig.getExpires() != null) { // a profile's `expires` field is in days, but hbase expects milliseconds long expiresDays = profileConfig.getExpires(); expiresMillis = Optional.of(TimeUnit.DAYS.toMillis(expiresDays)); } return expiresMillis; }
/** * Creates a message that will be emitted to Kafka. * * @param measurement The profile measurement used as a basis for the message. * @return A message that can be emitted to Kafka. */ private JSONObject createMessage(ProfileMeasurement measurement) { JSONObject message = new JSONObject(); message.put(PROFILE_FIELD, measurement.getDefinition().getProfile()); message.put(ENTITY_FIELD, measurement.getEntity()); message.put(PERIOD_ID_FIELD, measurement.getPeriod().getPeriod()); message.put(PERIOD_START_FIELD, measurement.getPeriod().getStartTimeMillis()); message.put(PERIOD_END_FIELD, measurement.getPeriod().getEndTimeMillis()); message.put(TIMESTAMP_FIELD, System.currentTimeMillis()); message.put(Constants.SENSOR_TYPE, sourceType); message.put(ALERT_FIELD, "true"); message.put(Constants.GUID, UUID.randomUUID().toString()); return message; }
/** * Appends triage values obtained from a {@code ProfileMeasurement} to the * outgoing message. * * @param measurement The measurement that may contain triage values. * @param message The message that the triage values are appended to. */ private void appendTriageValues(ProfileMeasurement measurement, JSONObject message) { // for each triage value... Map<String, Object> triageValues = MapUtils.emptyIfNull(measurement.getTriageValues()); triageValues.forEach((key, value) -> { // append the triage value to the message if(isValidType(value)) { message.put(key, value); } else { LOG.error(String.format( "triage expression must result in primitive type, skipping; type=%s, profile=%s, entity=%s, expr=%s", ClassUtils.getShortClassName(value, "null"), measurement.getDefinition().getProfile(), measurement.getEntity(), key)); } }); }