Search in sources :

Example 1 with RetentionPolicySetting

use of me.retrodaredevil.solarthing.influxdb.retention.RetentionPolicySetting in project solarthing by wildmountainfarms.

the class InfluxDbPacketSaver method handle.

@Override
public void handle(PacketCollection packetCollection) throws PacketHandleException {
    try (InfluxDB db = createDatabase()) {
        final InstancePacketGroup packetGroup = PacketGroups.parseToInstancePacketGroup(packetCollection, DefaultInstanceOptions.REQUIRE_NO_DEFAULTS);
        DefaultInstanceOptions.requireNoDefaults(packetGroup);
        final String database = databaseNameGetter.getName(packetGroup);
        try {
            QueryResult result = db.query(new Query("CREATE DATABASE " + database, null, true));
            String error = getError(result);
            if (error != null) {
                throw new PacketHandleException("Result got error! error: " + result);
            }
        } catch (InfluxDBException ex) {
            throw new PacketHandleException("Unable to query the database!", ex);
        }
        final RetentionPolicySetting retentionPolicySetting = retentionPolicyGetter.getRetentionPolicySetting();
        final String retentionPolicyName;
        // region Retention Policy Creation Logic
        if (retentionPolicySetting != null) {
            retentionPolicyName = retentionPolicySetting.getName();
            if (retentionPolicyName != null) {
                final RetentionPolicy policy = retentionPolicySetting.getRetentionPolicy();
                if (policy != null) {
                    final String policyString = policy.toPolicyStringInfluxDb1(retentionPolicyName, database);
                    final boolean needsAlter;
                    if (retentionPolicySetting.isTryToCreate()) {
                        final QueryResult result;
                        final String query = "CREATE " + policyString;
                        try {
                            result = db.query(new Query(query, null, true));
                        } catch (InfluxDBException ex) {
                            throw new PacketHandleException("Unable to query database to create retention policy: " + retentionPolicyName + " query: " + query, ex);
                        }
                        String error = getError(result);
                        if (retentionPolicySetting.isIgnoreUnsuccessfulCreate()) {
                            if (error != null) {
                                LOGGER.debug("We're going to ignore this error we got while trying to create a retention policy. Error: {}", error);
                            }
                            needsAlter = false;
                        } else {
                            if (error != null) {
                                LOGGER.debug("Got error while trying to create! Error: " + error);
                            }
                            needsAlter = error != null;
                        }
                        if (needsAlter && !retentionPolicySetting.isAutomaticallyAlter()) {
                            throw new PacketHandleException("Got error while trying to create retention policy: " + retentionPolicyName + ". Error: " + error);
                        }
                    } else {
                        needsAlter = true;
                    }
                    if (needsAlter) {
                        if (retentionPolicySetting.isAutomaticallyAlter()) {
                            final QueryResult alterResult;
                            try {
                                alterResult = db.query(new Query("ALTER " + policyString));
                                LOGGER.info(SolarThingConstants.SUMMARY_MARKER, "Successfully altered {} retention policy!", retentionPolicyName);
                            } catch (InfluxDBException ex) {
                                throw new PacketHandleException("Unable to query database to alter retention policy: " + retentionPolicyName, ex);
                            }
                            String error = getError(alterResult);
                            if (error != null) {
                                throw new PacketHandleException("Unable to alter retention policy: " + retentionPolicyName + ". Error: " + error);
                            }
                        } else {
                            throw new PacketHandleException("Retention policy: " + retentionPolicyName + " needs to be altered but automatically alter is false!");
                        }
                    }
                }
            }
        } else {
            retentionPolicyName = null;
        }
        // endregion
        final long time = packetCollection.getDateMillis();
        final BatchPoints points = BatchPoints.database(database).tag("sourceId", packetGroup.getSourceId()).tag("fragmentId", "" + packetGroup.getFragmentId()).consistency(InfluxDB.ConsistencyLevel.ALL).retentionPolicy(// may be null, but that's OK
        retentionPolicyName).build();
        int packetsWritten = 0;
        for (Packet packet : packetGroup.getPackets()) {
            Point.Builder pointBuilder = pointCreator.createBuilder(packet).time(time, TimeUnit.MILLISECONDS);
            Collection<String> tagKeys = PointUtil.getTagKeys(packet.getClass());
            ObjectNode json = OBJECT_MAPPER.valueToTree(packet);
            for (Map.Entry<String, ValueNode> entry : PointUtil.flattenJsonObject(json)) {
                String key = entry.getKey();
                ValueNode prim = entry.getValue();
                if (tagKeys.contains(key)) {
                    pointBuilder.tag(key, prim.asText());
                }
                if (prim.isNumber()) {
                    // always store as float datatype
                    pointBuilder.addField(key, prim.asDouble());
                } else if (prim.isTextual() || prim.isBinary()) {
                    pointBuilder.addField(key, prim.asText());
                } else if (prim.isBoolean()) {
                    pointBuilder.addField(key, prim.asBoolean());
                } else
                    throw new AssertionError("This primitive isn't a number, string/binary or boolean! It's: " + prim + " class: " + prim.getClass() + " text=" + prim.asText());
            }
            points.point(pointBuilder.build());
            packetsWritten++;
        }
        try {
            db.write(points);
        } catch (InfluxDBException ex) {
            throw new PacketHandleException("We were able to query the database, but unable to write the points to it!", ex);
        }
        LOGGER.debug("Wrote {} packets to InfluxDB! database={} retention policy={}", packetsWritten, database, retentionPolicyName);
    }
}
Also used : InstancePacketGroup(me.retrodaredevil.solarthing.packets.collection.InstancePacketGroup) Packet(me.retrodaredevil.solarthing.packets.Packet) Query(org.influxdb.dto.Query) BatchPoints(org.influxdb.dto.BatchPoints) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) Point(org.influxdb.dto.Point) RetentionPolicy(me.retrodaredevil.solarthing.influxdb.retention.RetentionPolicy) Point(org.influxdb.dto.Point) InfluxDBException(org.influxdb.InfluxDBException) QueryResult(org.influxdb.dto.QueryResult) InfluxDB(org.influxdb.InfluxDB) RetentionPolicySetting(me.retrodaredevil.solarthing.influxdb.retention.RetentionPolicySetting) ValueNode(com.fasterxml.jackson.databind.node.ValueNode) Map(java.util.Map) PacketHandleException(me.retrodaredevil.solarthing.packets.handling.PacketHandleException)

Aggregations

ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)1 ValueNode (com.fasterxml.jackson.databind.node.ValueNode)1 Map (java.util.Map)1 RetentionPolicy (me.retrodaredevil.solarthing.influxdb.retention.RetentionPolicy)1 RetentionPolicySetting (me.retrodaredevil.solarthing.influxdb.retention.RetentionPolicySetting)1 Packet (me.retrodaredevil.solarthing.packets.Packet)1 InstancePacketGroup (me.retrodaredevil.solarthing.packets.collection.InstancePacketGroup)1 PacketHandleException (me.retrodaredevil.solarthing.packets.handling.PacketHandleException)1 InfluxDB (org.influxdb.InfluxDB)1 InfluxDBException (org.influxdb.InfluxDBException)1 BatchPoints (org.influxdb.dto.BatchPoints)1 Point (org.influxdb.dto.Point)1 Query (org.influxdb.dto.Query)1 QueryResult (org.influxdb.dto.QueryResult)1