Search in sources :

Example 1 with BoltStats

use of org.apache.storm.generated.BoltStats in project storm by apache.

the class CaptureLoad method extractBoltValues.

private static List<Double> extractBoltValues(List<ExecutorSummary> summaries, GlobalStreamId id, Function<BoltStats, Map<String, Map<GlobalStreamId, Double>>> func) {
    List<Double> ret = new ArrayList<>();
    if (summaries != null) {
        for (ExecutorSummary summ : summaries) {
            if (summ != null && summ.is_set_stats()) {
                Map<String, Map<GlobalStreamId, Double>> data = func.apply(summ.get_stats().get_specific().get_bolt());
                if (data != null) {
                    List<Double> subvalues = data.values().stream().map((subMap) -> subMap.get(id)).filter((value) -> value != null).collect(Collectors.toList());
                    ret.addAll(subvalues);
                }
            }
        }
    }
    return ret;
}
Also used : Options(org.apache.commons.cli.Options) LoggerFactory(org.slf4j.LoggerFactory) HashMap(java.util.HashMap) HelpFormatter(org.apache.commons.cli.HelpFormatter) Function(java.util.function.Function) ComponentCommon(org.apache.storm.generated.ComponentCommon) ArrayList(java.util.ArrayList) DefaultParser(org.apache.commons.cli.DefaultParser) TopologyPageInfo(org.apache.storm.generated.TopologyPageInfo) Bolt(org.apache.storm.generated.Bolt) NimbusClient(org.apache.storm.utils.NimbusClient) Nimbus(org.apache.storm.generated.Nimbus) StormTopology(org.apache.storm.generated.StormTopology) JSONValue(org.json.simple.JSONValue) Map(java.util.Map) CommandLine(org.apache.commons.cli.CommandLine) Option(org.apache.commons.cli.Option) Logger(org.slf4j.Logger) CommandLineParser(org.apache.commons.cli.CommandLineParser) JSONParser(org.json.simple.parser.JSONParser) WorkerSummary(org.apache.storm.generated.WorkerSummary) Grouping(org.apache.storm.generated.Grouping) StreamInfo(org.apache.storm.generated.StreamInfo) TopologyInfo(org.apache.storm.generated.TopologyInfo) Collectors(java.util.stream.Collectors) File(java.io.File) GlobalStreamId(org.apache.storm.generated.GlobalStreamId) ExecutorSummary(org.apache.storm.generated.ExecutorSummary) List(java.util.List) ObjectReader(org.apache.storm.utils.ObjectReader) JSONObject(org.json.simple.JSONObject) ParseException(org.apache.commons.cli.ParseException) SpoutSpec(org.apache.storm.generated.SpoutSpec) Config(org.apache.storm.Config) TopologySummary(org.apache.storm.generated.TopologySummary) BoltStats(org.apache.storm.generated.BoltStats) ClusterSummary(org.apache.storm.generated.ClusterSummary) ArrayList(java.util.ArrayList) HashMap(java.util.HashMap) Map(java.util.Map) ExecutorSummary(org.apache.storm.generated.ExecutorSummary)

Example 2 with BoltStats

use of org.apache.storm.generated.BoltStats in project storm by apache.

the class CaptureLoad method captureTopology.

static TopologyLoadConf captureTopology(Nimbus.Iface client, TopologySummary topologySummary) throws Exception {
    String topologyName = topologySummary.get_name();
    LOG.info("Capturing {}...", topologyName);
    String topologyId = topologySummary.get_id();
    TopologyInfo info = client.getTopologyInfo(topologyId);
    TopologyPageInfo tpinfo = client.getTopologyPageInfo(topologyId, ":all-time", false);
    @SuppressWarnings("checkstyle:VariableDeclarationUsageDistance") StormTopology topo = client.getUserTopology(topologyId);
    // Done capturing topology information...
    Map<String, Object> savedTopoConf = new HashMap<>();
    Map<String, Object> topoConf = (Map<String, Object>) JSONValue.parse(client.getTopologyConf(topologyId));
    for (String key : TopologyLoadConf.IMPORTANT_CONF_KEYS) {
        Object o = topoConf.get(key);
        if (o != null) {
            savedTopoConf.put(key, o);
            LOG.info("with config {}: {}", key, o);
        }
    }
    // Lets use the number of actually scheduled workers as a way to bridge RAS and non-RAS
    int numWorkers = tpinfo.get_num_workers();
    if (savedTopoConf.containsKey(Config.TOPOLOGY_WORKERS)) {
        numWorkers = Math.max(numWorkers, ((Number) savedTopoConf.get(Config.TOPOLOGY_WORKERS)).intValue());
    }
    savedTopoConf.put(Config.TOPOLOGY_WORKERS, numWorkers);
    Map<String, LoadCompConf.Builder> boltBuilders = new HashMap<>();
    Map<String, LoadCompConf.Builder> spoutBuilders = new HashMap<>();
    List<InputStream.Builder> inputStreams = new ArrayList<>();
    Map<GlobalStreamId, OutputStream.Builder> outStreams = new HashMap<>();
    // Bolts
    if (topo.get_bolts() != null) {
        for (Map.Entry<String, Bolt> boltSpec : topo.get_bolts().entrySet()) {
            String boltComp = boltSpec.getKey();
            LOG.info("Found bolt {}...", boltComp);
            Bolt bolt = boltSpec.getValue();
            ComponentCommon common = bolt.get_common();
            Map<GlobalStreamId, Grouping> inputs = common.get_inputs();
            if (inputs != null) {
                for (Map.Entry<GlobalStreamId, Grouping> input : inputs.entrySet()) {
                    GlobalStreamId id = input.getKey();
                    LOG.info("with input {}...", id);
                    Grouping grouping = input.getValue();
                    InputStream.Builder builder = new InputStream.Builder().withId(id.get_streamId()).withFromComponent(id.get_componentId()).withToComponent(boltComp).withGroupingType(grouping);
                    inputStreams.add(builder);
                }
            }
            Map<String, StreamInfo> outputs = common.get_streams();
            if (outputs != null) {
                for (String name : outputs.keySet()) {
                    GlobalStreamId id = new GlobalStreamId(boltComp, name);
                    LOG.info("and output {}...", id);
                    OutputStream.Builder builder = new OutputStream.Builder().withId(name);
                    outStreams.put(id, builder);
                }
            }
            LoadCompConf.Builder builder = new LoadCompConf.Builder().withParallelism(common.get_parallelism_hint()).withId(boltComp);
            boltBuilders.put(boltComp, builder);
        }
        Map<String, Map<String, Double>> boltResources = getBoltsResources(topo, topoConf);
        for (Map.Entry<String, Map<String, Double>> entry : boltResources.entrySet()) {
            LoadCompConf.Builder bd = boltBuilders.get(entry.getKey());
            if (bd != null) {
                Map<String, Double> resources = entry.getValue();
                Double cpu = resources.get(Config.TOPOLOGY_COMPONENT_CPU_PCORE_PERCENT);
                if (cpu != null) {
                    bd.withCpuLoad(cpu);
                }
                Double mem = resources.get(Config.TOPOLOGY_COMPONENT_RESOURCES_ONHEAP_MEMORY_MB);
                if (mem != null) {
                    bd.withMemoryLoad(mem);
                }
            }
        }
    }
    // Spouts
    if (topo.get_spouts() != null) {
        for (Map.Entry<String, SpoutSpec> spoutSpec : topo.get_spouts().entrySet()) {
            String spoutComp = spoutSpec.getKey();
            LOG.info("Found Spout {}...", spoutComp);
            SpoutSpec spout = spoutSpec.getValue();
            ComponentCommon common = spout.get_common();
            Map<String, StreamInfo> outputs = common.get_streams();
            if (outputs != null) {
                for (String name : outputs.keySet()) {
                    GlobalStreamId id = new GlobalStreamId(spoutComp, name);
                    LOG.info("with output {}...", id);
                    OutputStream.Builder builder = new OutputStream.Builder().withId(name);
                    outStreams.put(id, builder);
                }
            }
            LoadCompConf.Builder builder = new LoadCompConf.Builder().withParallelism(common.get_parallelism_hint()).withId(spoutComp);
            spoutBuilders.put(spoutComp, builder);
        }
        Map<String, Map<String, Double>> spoutResources = getSpoutsResources(topo, topoConf);
        for (Map.Entry<String, Map<String, Double>> entry : spoutResources.entrySet()) {
            LoadCompConf.Builder sd = spoutBuilders.get(entry.getKey());
            if (sd != null) {
                Map<String, Double> resources = entry.getValue();
                Double cpu = resources.get(Config.TOPOLOGY_COMPONENT_CPU_PCORE_PERCENT);
                if (cpu != null) {
                    sd.withCpuLoad(cpu);
                }
                Double mem = resources.get(Config.TOPOLOGY_COMPONENT_RESOURCES_ONHEAP_MEMORY_MB);
                if (mem != null) {
                    sd.withMemoryLoad(mem);
                }
            }
        }
    }
    // Stats...
    Map<String, List<ExecutorSummary>> byComponent = new HashMap<>();
    for (ExecutorSummary executor : info.get_executors()) {
        String component = executor.get_component_id();
        List<ExecutorSummary> list = byComponent.get(component);
        if (list == null) {
            list = new ArrayList<>();
            byComponent.put(component, list);
        }
        list.add(executor);
    }
    List<InputStream> streams = new ArrayList<>(inputStreams.size());
    // Compute the stats for the different input streams
    for (InputStream.Builder builder : inputStreams) {
        GlobalStreamId streamId = new GlobalStreamId(builder.getFromComponent(), builder.getId());
        List<ExecutorSummary> summaries = byComponent.get(builder.getToComponent());
        // Execute and process latency...
        builder.withProcessTime(new NormalDistStats(extractBoltValues(summaries, streamId, BoltStats::get_process_ms_avg)));
        builder.withExecTime(new NormalDistStats(extractBoltValues(summaries, streamId, BoltStats::get_execute_ms_avg)));
        // InputStream is done
        streams.add(builder.build());
    }
    // There is a bug in some versions that returns 0 for the uptime.
    // To work around it we should get it an alternative (working) way.
    Map<String, Integer> workerToUptime = new HashMap<>();
    for (WorkerSummary ws : tpinfo.get_workers()) {
        workerToUptime.put(ws.get_supervisor_id() + ":" + ws.get_port(), ws.get_uptime_secs());
    }
    LOG.debug("WORKER TO UPTIME {}", workerToUptime);
    for (Map.Entry<GlobalStreamId, OutputStream.Builder> entry : outStreams.entrySet()) {
        OutputStream.Builder builder = entry.getValue();
        GlobalStreamId id = entry.getKey();
        List<Double> emittedRate = new ArrayList<>();
        List<ExecutorSummary> summaries = byComponent.get(id.get_componentId());
        if (summaries != null) {
            for (ExecutorSummary summary : summaries) {
                if (summary.is_set_stats()) {
                    int uptime = summary.get_uptime_secs();
                    LOG.debug("UPTIME {}", uptime);
                    if (uptime <= 0) {
                        // Likely it is because of a bug, so try to get it another way
                        String key = summary.get_host() + ":" + summary.get_port();
                        uptime = workerToUptime.getOrDefault(key, 1);
                        LOG.debug("Getting uptime for worker {}, {}", key, uptime);
                    }
                    for (Map.Entry<String, Map<String, Long>> statEntry : summary.get_stats().get_emitted().entrySet()) {
                        String timeWindow = statEntry.getKey();
                        long timeSecs = uptime;
                        try {
                            timeSecs = Long.valueOf(timeWindow);
                        } catch (NumberFormatException e) {
                        // Ignored...
                        }
                        timeSecs = Math.min(timeSecs, uptime);
                        Long count = statEntry.getValue().get(id.get_streamId());
                        if (count != null) {
                            LOG.debug("{} emitted {} for {} secs or {} tuples/sec", id, count, timeSecs, count.doubleValue() / timeSecs);
                            emittedRate.add(count.doubleValue() / timeSecs);
                        }
                    }
                }
            }
        }
        builder.withRate(new NormalDistStats(emittedRate));
        // The OutputStream is done
        LoadCompConf.Builder comp = boltBuilders.get(id.get_componentId());
        if (comp == null) {
            comp = spoutBuilders.get(id.get_componentId());
        }
        comp.withStream(builder.build());
    }
    List<LoadCompConf> spouts = spoutBuilders.values().stream().map((b) -> b.build()).collect(Collectors.toList());
    List<LoadCompConf> bolts = boltBuilders.values().stream().map((b) -> b.build()).collect(Collectors.toList());
    return new TopologyLoadConf(topologyName, savedTopoConf, spouts, bolts, streams);
}
Also used : Options(org.apache.commons.cli.Options) LoggerFactory(org.slf4j.LoggerFactory) HashMap(java.util.HashMap) HelpFormatter(org.apache.commons.cli.HelpFormatter) Function(java.util.function.Function) ComponentCommon(org.apache.storm.generated.ComponentCommon) ArrayList(java.util.ArrayList) DefaultParser(org.apache.commons.cli.DefaultParser) TopologyPageInfo(org.apache.storm.generated.TopologyPageInfo) Bolt(org.apache.storm.generated.Bolt) NimbusClient(org.apache.storm.utils.NimbusClient) Nimbus(org.apache.storm.generated.Nimbus) StormTopology(org.apache.storm.generated.StormTopology) JSONValue(org.json.simple.JSONValue) Map(java.util.Map) CommandLine(org.apache.commons.cli.CommandLine) Option(org.apache.commons.cli.Option) Logger(org.slf4j.Logger) CommandLineParser(org.apache.commons.cli.CommandLineParser) JSONParser(org.json.simple.parser.JSONParser) WorkerSummary(org.apache.storm.generated.WorkerSummary) Grouping(org.apache.storm.generated.Grouping) StreamInfo(org.apache.storm.generated.StreamInfo) TopologyInfo(org.apache.storm.generated.TopologyInfo) Collectors(java.util.stream.Collectors) File(java.io.File) GlobalStreamId(org.apache.storm.generated.GlobalStreamId) ExecutorSummary(org.apache.storm.generated.ExecutorSummary) List(java.util.List) ObjectReader(org.apache.storm.utils.ObjectReader) JSONObject(org.json.simple.JSONObject) ParseException(org.apache.commons.cli.ParseException) SpoutSpec(org.apache.storm.generated.SpoutSpec) Config(org.apache.storm.Config) TopologySummary(org.apache.storm.generated.TopologySummary) BoltStats(org.apache.storm.generated.BoltStats) ClusterSummary(org.apache.storm.generated.ClusterSummary) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) ExecutorSummary(org.apache.storm.generated.ExecutorSummary) ArrayList(java.util.ArrayList) List(java.util.List) ComponentCommon(org.apache.storm.generated.ComponentCommon) Bolt(org.apache.storm.generated.Bolt) Grouping(org.apache.storm.generated.Grouping) SpoutSpec(org.apache.storm.generated.SpoutSpec) GlobalStreamId(org.apache.storm.generated.GlobalStreamId) JSONObject(org.json.simple.JSONObject) HashMap(java.util.HashMap) Map(java.util.Map) StormTopology(org.apache.storm.generated.StormTopology) BoltStats(org.apache.storm.generated.BoltStats) TopologyPageInfo(org.apache.storm.generated.TopologyPageInfo) WorkerSummary(org.apache.storm.generated.WorkerSummary) StreamInfo(org.apache.storm.generated.StreamInfo) TopologyInfo(org.apache.storm.generated.TopologyInfo)

Example 3 with BoltStats

use of org.apache.storm.generated.BoltStats in project storm by apache.

the class BoltExecutorStats method renderStats.

@Override
public ExecutorStats renderStats() {
    ExecutorStats ret = new ExecutorStats();
    // common stats
    ret.set_emitted(valueStat(getEmitted()));
    ret.set_transferred(valueStat(getTransferred()));
    ret.set_rate(this.rate);
    // bolt stats
    BoltStats boltStats = new BoltStats(ClientStatsUtil.windowSetConverter(valueStat(getAcked()), ClientStatsUtil.TO_GSID, ClientStatsUtil.IDENTITY), ClientStatsUtil.windowSetConverter(valueStat(getFailed()), ClientStatsUtil.TO_GSID, ClientStatsUtil.IDENTITY), ClientStatsUtil.windowSetConverter(valueStat(processLatencyStats), ClientStatsUtil.TO_GSID, ClientStatsUtil.IDENTITY), ClientStatsUtil.windowSetConverter(valueStat(executedStats), ClientStatsUtil.TO_GSID, ClientStatsUtil.IDENTITY), ClientStatsUtil.windowSetConverter(valueStat(executeLatencyStats), ClientStatsUtil.TO_GSID, ClientStatsUtil.IDENTITY));
    ret.set_specific(ExecutorSpecificStats.bolt(boltStats));
    return ret;
}
Also used : ExecutorStats(org.apache.storm.generated.ExecutorStats) BoltStats(org.apache.storm.generated.BoltStats)

Example 4 with BoltStats

use of org.apache.storm.generated.BoltStats in project storm by apache.

the class StatsUtil method thriftifySpecificStats.

private static ExecutorSpecificStats thriftifySpecificStats(Map stats) {
    ExecutorSpecificStats specificStats = new ExecutorSpecificStats();
    String compType = (String) stats.get(TYPE);
    if (ClientStatsUtil.BOLT.equals(compType)) {
        BoltStats boltStats = new BoltStats();
        boltStats.set_acked(ClientStatsUtil.windowSetConverter(ClientStatsUtil.getMapByKey(stats, ACKED), ClientStatsUtil.TO_GSID, TO_STRING));
        boltStats.set_executed(ClientStatsUtil.windowSetConverter(ClientStatsUtil.getMapByKey(stats, EXECUTED), ClientStatsUtil.TO_GSID, TO_STRING));
        boltStats.set_execute_ms_avg(ClientStatsUtil.windowSetConverter(ClientStatsUtil.getMapByKey(stats, EXEC_LATENCIES), ClientStatsUtil.TO_GSID, TO_STRING));
        boltStats.set_failed(ClientStatsUtil.windowSetConverter(ClientStatsUtil.getMapByKey(stats, FAILED), ClientStatsUtil.TO_GSID, TO_STRING));
        boltStats.set_process_ms_avg(ClientStatsUtil.windowSetConverter(ClientStatsUtil.getMapByKey(stats, PROC_LATENCIES), ClientStatsUtil.TO_GSID, TO_STRING));
        specificStats.set_bolt(boltStats);
    } else {
        SpoutStats spoutStats = new SpoutStats();
        spoutStats.set_acked(ClientStatsUtil.windowSetConverter(ClientStatsUtil.getMapByKey(stats, ACKED), TO_STRING, TO_STRING));
        spoutStats.set_failed(ClientStatsUtil.windowSetConverter(ClientStatsUtil.getMapByKey(stats, FAILED), TO_STRING, TO_STRING));
        spoutStats.set_complete_ms_avg(ClientStatsUtil.windowSetConverter(ClientStatsUtil.getMapByKey(stats, COMP_LATENCIES), TO_STRING, TO_STRING));
        specificStats.set_spout(spoutStats);
    }
    return specificStats;
}
Also used : ExecutorSpecificStats(org.apache.storm.generated.ExecutorSpecificStats) BoltStats(org.apache.storm.generated.BoltStats) SpoutStats(org.apache.storm.generated.SpoutStats)

Aggregations

BoltStats (org.apache.storm.generated.BoltStats)4 File (java.io.File)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 List (java.util.List)2 Map (java.util.Map)2 Function (java.util.function.Function)2 Collectors (java.util.stream.Collectors)2 CommandLine (org.apache.commons.cli.CommandLine)2 CommandLineParser (org.apache.commons.cli.CommandLineParser)2 DefaultParser (org.apache.commons.cli.DefaultParser)2 HelpFormatter (org.apache.commons.cli.HelpFormatter)2 Option (org.apache.commons.cli.Option)2 Options (org.apache.commons.cli.Options)2 ParseException (org.apache.commons.cli.ParseException)2 Config (org.apache.storm.Config)2 Bolt (org.apache.storm.generated.Bolt)2 ClusterSummary (org.apache.storm.generated.ClusterSummary)2 ComponentCommon (org.apache.storm.generated.ComponentCommon)2 ExecutorSummary (org.apache.storm.generated.ExecutorSummary)2