com.cloudera.lib.service.instrumentation.TestInstrumentationService.java Source code

Java tutorial

Introduction

Here is the source code for com.cloudera.lib.service.instrumentation.TestInstrumentationService.java

Source

/*
 * Copyright (c) 2011, Cloudera, Inc. All Rights Reserved.
 *
 * Cloudera, Inc. licenses this file to you under the Apache License,
 * Version 2.0 (the "License"). You may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * This software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 * CONDITIONS OF ANY KIND, either express or implied. See the License for
 * the specific language governing permissions and limitations under the
 * License.
 */
package com.cloudera.lib.service.instrumentation;

import com.cloudera.circus.test.TestDir;
import com.cloudera.circus.test.XTest;
import com.cloudera.lib.lang.StringUtils;
import com.cloudera.lib.server.Server;
import com.cloudera.lib.service.Instrumentation;
import com.cloudera.lib.service.scheduler.SchedulerService;
import com.cloudera.lib.util.XConfiguration;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.testng.Assert;
import org.testng.annotations.Test;

import java.io.StringWriter;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

public class TestInstrumentationService extends XTest {

    @Override
    protected float getWaitForRatio() {
        return 1;
    }

    @Test
    public void cron() {
        InstrumentationService.Cron cron = new InstrumentationService.Cron();
        Assert.assertEquals(cron.start, 0);
        Assert.assertEquals(cron.lapStart, 0);
        Assert.assertEquals(cron.own, 0);
        Assert.assertEquals(cron.total, 0);
        long begin = System.currentTimeMillis();
        Assert.assertEquals(cron.start(), cron);
        Assert.assertEquals(cron.start(), cron);
        Assert.assertEquals(cron.start, begin, 20);
        Assert.assertEquals(cron.start, cron.lapStart);
        sleep(100);
        Assert.assertEquals(cron.stop(), cron);
        long end = System.currentTimeMillis();
        long delta = end - begin;
        Assert.assertEquals(cron.own, delta, 20);
        Assert.assertEquals(cron.total, 0);
        Assert.assertEquals(cron.lapStart, 0);
        sleep(100);
        long reStart = System.currentTimeMillis();
        cron.start();
        Assert.assertEquals(cron.start, begin, 20);
        Assert.assertEquals(cron.lapStart, reStart, 20);
        sleep(100);
        cron.stop();
        long reEnd = System.currentTimeMillis();
        delta += reEnd - reStart;
        Assert.assertEquals(cron.own, delta, 20);
        Assert.assertEquals(cron.total, 0);
        Assert.assertEquals(cron.lapStart, 0);
        cron.end();
        Assert.assertEquals(cron.total, reEnd - begin, 20);

        try {
            cron.start();
            Assert.fail();
        } catch (IllegalStateException ex) {
        } catch (Exception ex) {
            Assert.fail();
        }

        try {
            cron.stop();
            Assert.fail();
        } catch (IllegalStateException ex) {
        } catch (Exception ex) {
            Assert.fail();
        }
    }

    @Test
    public void timer() throws Exception {
        InstrumentationService.Timer timer = new InstrumentationService.Timer(2);
        InstrumentationService.Cron cron = new InstrumentationService.Cron();

        long ownStart;
        long ownEnd;
        long totalStart;
        long totalEnd;
        long ownDelta;
        long totalDelta;
        long avgTotal;
        long avgOwn;

        cron.start();
        ownStart = System.currentTimeMillis();
        totalStart = ownStart;
        ownDelta = 0;
        sleep(100);

        cron.stop();
        ownEnd = System.currentTimeMillis();
        ownDelta += ownEnd - ownStart;
        sleep(100);

        cron.start();
        ownStart = System.currentTimeMillis();
        sleep(100);

        cron.stop();
        ownEnd = System.currentTimeMillis();
        ownDelta += ownEnd - ownStart;
        totalEnd = ownEnd;
        totalDelta = totalEnd - totalStart;

        avgTotal = totalDelta;
        avgOwn = ownDelta;

        timer.addCron(cron);
        long[] values = timer.getValues();
        Assert.assertEquals(values[InstrumentationService.Timer.LAST_TOTAL], totalDelta, 20);
        Assert.assertEquals(values[InstrumentationService.Timer.LAST_OWN], ownDelta, 20);
        Assert.assertEquals(values[InstrumentationService.Timer.AVG_TOTAL], avgTotal, 20);
        Assert.assertEquals(values[InstrumentationService.Timer.AVG_OWN], avgOwn, 20);

        cron = new InstrumentationService.Cron();

        cron.start();
        ownStart = System.currentTimeMillis();
        totalStart = ownStart;
        ownDelta = 0;
        sleep(200);

        cron.stop();
        ownEnd = System.currentTimeMillis();
        ownDelta += ownEnd - ownStart;
        sleep(200);

        cron.start();
        ownStart = System.currentTimeMillis();
        sleep(200);

        cron.stop();
        ownEnd = System.currentTimeMillis();
        ownDelta += ownEnd - ownStart;
        totalEnd = ownEnd;
        totalDelta = totalEnd - totalStart;

        avgTotal = (avgTotal * 1 + totalDelta) / 2;
        avgOwn = (avgOwn * 1 + ownDelta) / 2;

        timer.addCron(cron);
        values = timer.getValues();
        Assert.assertEquals(values[InstrumentationService.Timer.LAST_TOTAL], totalDelta, 20);
        Assert.assertEquals(values[InstrumentationService.Timer.LAST_OWN], ownDelta, 20);
        Assert.assertEquals(values[InstrumentationService.Timer.AVG_TOTAL], avgTotal, 20);
        Assert.assertEquals(values[InstrumentationService.Timer.AVG_OWN], avgOwn, 20);

        avgTotal = totalDelta;
        avgOwn = ownDelta;

        cron = new InstrumentationService.Cron();

        cron.start();
        ownStart = System.currentTimeMillis();
        totalStart = ownStart;
        ownDelta = 0;
        sleep(300);

        cron.stop();
        ownEnd = System.currentTimeMillis();
        ownDelta += ownEnd - ownStart;
        sleep(300);

        cron.start();
        ownStart = System.currentTimeMillis();
        sleep(300);

        cron.stop();
        ownEnd = System.currentTimeMillis();
        ownDelta += ownEnd - ownStart;
        totalEnd = ownEnd;
        totalDelta = totalEnd - totalStart;

        avgTotal = (avgTotal * 1 + totalDelta) / 2;
        avgOwn = (avgOwn * 1 + ownDelta) / 2;

        cron.stop();
        timer.addCron(cron);
        values = timer.getValues();
        Assert.assertEquals(values[InstrumentationService.Timer.LAST_TOTAL], totalDelta, 20);
        Assert.assertEquals(values[InstrumentationService.Timer.LAST_OWN], ownDelta, 20);
        Assert.assertEquals(values[InstrumentationService.Timer.AVG_TOTAL], avgTotal, 20);
        Assert.assertEquals(values[InstrumentationService.Timer.AVG_OWN], avgOwn, 20);

        JSONObject json = (JSONObject) new JSONParser().parse(timer.toJSONString());
        Assert.assertEquals(json.size(), 4);
        Assert.assertEquals(json.get("lastTotal"), values[InstrumentationService.Timer.LAST_TOTAL]);
        Assert.assertEquals(json.get("lastOwn"), values[InstrumentationService.Timer.LAST_OWN]);
        Assert.assertEquals(json.get("avgTotal"), values[InstrumentationService.Timer.AVG_TOTAL]);
        Assert.assertEquals(json.get("avgOwn"), values[InstrumentationService.Timer.AVG_OWN]);

        StringWriter writer = new StringWriter();
        timer.writeJSONString(writer);
        writer.close();
        json = (JSONObject) new JSONParser().parse(writer.toString());
        Assert.assertEquals(json.size(), 4);
        Assert.assertEquals(json.get("lastTotal"), values[InstrumentationService.Timer.LAST_TOTAL]);
        Assert.assertEquals(json.get("lastOwn"), values[InstrumentationService.Timer.LAST_OWN]);
        Assert.assertEquals(json.get("avgTotal"), values[InstrumentationService.Timer.AVG_TOTAL]);
        Assert.assertEquals(json.get("avgOwn"), values[InstrumentationService.Timer.AVG_OWN]);
    }

    @Test
    public void sampler() throws Exception {
        final long value[] = new long[1];
        Instrumentation.Variable<Long> var = new Instrumentation.Variable<Long>() {
            @Override
            public Long getValue() {
                return value[0];
            }
        };

        InstrumentationService.Sampler sampler = new InstrumentationService.Sampler();
        sampler.init(4, var);
        Assert.assertEquals(sampler.getRate(), 0f, 0.0001);
        sampler.sample();
        Assert.assertEquals(sampler.getRate(), 0f, 0.0001);
        value[0] = 1;
        sampler.sample();
        Assert.assertEquals(sampler.getRate(), (0d + 1) / 2, 0.0001);
        value[0] = 2;
        sampler.sample();
        Assert.assertEquals(sampler.getRate(), (0d + 1 + 2) / 3, 0.0001);
        value[0] = 3;
        sampler.sample();
        Assert.assertEquals(sampler.getRate(), (0d + 1 + 2 + 3) / 4, 0.0001);
        value[0] = 4;
        sampler.sample();
        Assert.assertEquals(sampler.getRate(), (4d + 1 + 2 + 3) / 4, 0.0001);

        JSONObject json = (JSONObject) new JSONParser().parse(sampler.toJSONString());
        Assert.assertEquals(json.size(), 2);
        Assert.assertEquals(json.get("sampler"), sampler.getRate());
        Assert.assertEquals(json.get("size"), 4L);

        StringWriter writer = new StringWriter();
        sampler.writeJSONString(writer);
        writer.close();
        json = (JSONObject) new JSONParser().parse(writer.toString());
        Assert.assertEquals(json.size(), 2);
        Assert.assertEquals(json.get("sampler"), sampler.getRate());
        Assert.assertEquals(json.get("size"), 4L);
    }

    @Test
    public void variableHolder() throws Exception {
        InstrumentationService.VariableHolder<String> variableHolder = new InstrumentationService.VariableHolder<String>();

        variableHolder.var = new Instrumentation.Variable<String>() {
            @Override
            public String getValue() {
                return "foo";
            }
        };

        JSONObject json = (JSONObject) new JSONParser().parse(variableHolder.toJSONString());
        Assert.assertEquals(json.size(), 1);
        Assert.assertEquals(json.get("value"), "foo");

        StringWriter writer = new StringWriter();
        variableHolder.writeJSONString(writer);
        writer.close();
        json = (JSONObject) new JSONParser().parse(writer.toString());
        Assert.assertEquals(json.size(), 1);
        Assert.assertEquals(json.get("value"), "foo");
    }

    @Test
    @TestDir
    @SuppressWarnings("unchecked")
    public void service() throws Exception {
        String dir = getTestDir().getAbsolutePath();
        String services = StringUtils.toString(Arrays.asList(InstrumentationService.class.getName()), ",");
        XConfiguration conf = new XConfiguration();
        conf.set("server.services", services);
        Server server = new Server("server", dir, dir, dir, dir, conf);
        server.init();

        Instrumentation instrumentation = server.get(Instrumentation.class);
        Assert.assertNotNull(instrumentation);
        instrumentation.incr("g", "c", 1);
        instrumentation.incr("g", "c", 2);
        instrumentation.incr("g", "c1", 2);

        Instrumentation.Cron cron = instrumentation.createCron();
        cron.start();
        sleep(100);
        cron.stop();
        instrumentation.addCron("g", "t", cron);
        cron = instrumentation.createCron();
        cron.start();
        sleep(200);
        cron.stop();
        instrumentation.addCron("g", "t", cron);

        Instrumentation.Variable<String> var = new Instrumentation.Variable<String>() {
            @Override
            public String getValue() {
                return "foo";
            }
        };
        instrumentation.addVariable("g", "v", var);

        Instrumentation.Variable<Long> varToSample = new Instrumentation.Variable<Long>() {
            @Override
            public Long getValue() {
                return 1L;
            }
        };
        instrumentation.addSampler("g", "s", 10, varToSample);

        Map<String, ?> snapshot = instrumentation.getSnapshot();
        Assert.assertNotNull(snapshot.get("os-env"));
        Assert.assertNotNull(snapshot.get("sys-props"));
        Assert.assertNotNull(snapshot.get("jvm"));
        Assert.assertNotNull(snapshot.get("counters"));
        Assert.assertNotNull(snapshot.get("timers"));
        Assert.assertNotNull(snapshot.get("variables"));
        Assert.assertNotNull(snapshot.get("samplers"));
        Assert.assertNotNull(((Map<String, String>) snapshot.get("os-env")).get("PATH"));
        Assert.assertNotNull(((Map<String, String>) snapshot.get("sys-props")).get("java.version"));
        Assert.assertNotNull(((Map<String, ?>) snapshot.get("jvm")).get("free.memory"));
        Assert.assertNotNull(((Map<String, ?>) snapshot.get("jvm")).get("max.memory"));
        Assert.assertNotNull(((Map<String, ?>) snapshot.get("jvm")).get("total.memory"));
        Assert.assertNotNull(((Map<String, Map<String, Object>>) snapshot.get("counters")).get("g"));
        Assert.assertNotNull(((Map<String, Map<String, Object>>) snapshot.get("timers")).get("g"));
        Assert.assertNotNull(((Map<String, Map<String, Object>>) snapshot.get("variables")).get("g"));
        Assert.assertNotNull(((Map<String, Map<String, Object>>) snapshot.get("samplers")).get("g"));
        Assert.assertNotNull(((Map<String, Map<String, Object>>) snapshot.get("counters")).get("g").get("c"));
        Assert.assertNotNull(((Map<String, Map<String, Object>>) snapshot.get("counters")).get("g").get("c1"));
        Assert.assertNotNull(((Map<String, Map<String, Object>>) snapshot.get("timers")).get("g").get("t"));
        Assert.assertNotNull(((Map<String, Map<String, Object>>) snapshot.get("variables")).get("g").get("v"));
        Assert.assertNotNull(((Map<String, Map<String, Object>>) snapshot.get("samplers")).get("g").get("s"));

        StringWriter writer = new StringWriter();
        JSONObject.writeJSONString(snapshot, writer);
        writer.close();
        server.destroy();
    }

    @Test
    @TestDir
    @SuppressWarnings("unchecked")
    public void sampling() throws Exception {
        String dir = getTestDir().getAbsolutePath();
        String services = StringUtils.toString(
                Arrays.asList(InstrumentationService.class.getName(), SchedulerService.class.getName()), ",");
        XConfiguration conf = new XConfiguration();
        conf.set("server.services", services);
        Server server = new Server("server", dir, dir, dir, dir, conf);
        server.init();
        Instrumentation instrumentation = server.get(Instrumentation.class);

        final AtomicInteger count = new AtomicInteger();

        Instrumentation.Variable<Long> varToSample = new Instrumentation.Variable<Long>() {
            @Override
            public Long getValue() {
                return (long) count.incrementAndGet();
            }
        };
        instrumentation.addSampler("g", "s", 10, varToSample);

        sleep(2000);
        int i = count.get();
        Assert.assertTrue(i > 0);

        Map<String, Map<String, ?>> snapshot = instrumentation.getSnapshot();
        Map<String, Map<String, Object>> samplers = (Map<String, Map<String, Object>>) snapshot.get("samplers");
        InstrumentationService.Sampler sampler = (InstrumentationService.Sampler) samplers.get("g").get("s");
        Assert.assertTrue(sampler.getRate() > 0);

        server.destroy();
    }

}