/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* Licensed 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
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License 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 scouter.agent.counter;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import scouter.agent.Configure;
import scouter.agent.Logger;
import scouter.agent.counter.anotation.Counter;
import scouter.agent.netio.data.DataProxy;
import scouter.lang.pack.PerfCounterPack;
import scouter.util.ThreadUtil;
import scouter.util.scan.Scanner;
public class CounterExecutingManager extends Thread {
private static CounterExecutingManager instance;
public final static synchronized CounterExecutingManager getInstance() {
if (instance == null) {
instance = new CounterExecutingManager();
instance.setDaemon(true);
instance.setName(ThreadUtil.getName(instance));
instance.start();
}
return instance;
}
Configure conf = Configure.getInstance();
public void run() {
while (true) {
ThreadUtil.sleep(1000);
if (conf.counter_enabled == false) {
continue;
}
long now = System.currentTimeMillis();
CounterBasket pw = new CounterBasket();
for (int i = 0; i < taskSec.size(); i++) {
CountStat r = taskSec.get(i);
try {
if (r.counter.interval() <= now - r.xtime) {
r.xtime = now;
r.counter.process(pw);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
//
PerfCounterPack[] pks = pw.getList();
DataProxy.sendCounter(pks);
}
}
private CounterExecutingManager() {
}
private List<CountStat> taskSec = new ArrayList<CountStat>();
static class CountStat {
Invocation counter;
long xtime;
CountStat(Invocation counter) {
this.counter = counter;
}
}
public void put(Invocation counter) {
taskSec.add(new CountStat(counter));
}
protected static class Invocation {
Object object;
Method method;
long time;
public Invocation(Object object, Method method, long interval) {
this.object = object;
this.method = method;
this.time=interval;
}
public void process(CounterBasket pw) throws Throwable {
try {
method.invoke(object, pw);
} catch (Exception e) {
Logger.println("A111", object.getClass() + " " + method + " " + e);
}
}
public long interval() {
return this.time;
}
}
public static void load() {
Set<String> defaultTasks = new Scanner("scouter.agent.counter.task").process();
Set<String> customTasks = new Scanner(System.getProperty("scouter.task")).process();
defaultTasks.addAll(customTasks);
int n = 0;
Iterator<String> itr = defaultTasks.iterator();
while (itr.hasNext()) {
try {
Class c = Class.forName(itr.next());
if (Modifier.isPublic(c.getModifiers()) == false)
continue;
Method[] m = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++) {
Counter mapAn = (Counter) m[i].getAnnotation(Counter.class);
if (mapAn == null)
continue;
int interval=mapAn.interval();
CounterExecutingManager.getInstance().put(new Invocation(c.newInstance(), m[i], interval));
n++;
}
} catch (Throwable t) {
scouter.agent.Logger.println("A112", ThreadUtil.getStackTrace(t));
}
}
scouter.agent.Logger.println("A113", "Counter Collector Started (#" + n + ")");
}
public static void main(String[] args) {
load();
}
}