use of org.glassfish.flashlight.provider.FlashlightProbe in project Payara by payara.
the class StatsProviderManagerDelegateImpl method hasListeners.
public boolean hasListeners(String probeStr) {
boolean hasListeners = false;
FlashlightProbe probe = probeRegistry.getProbe(probeStr);
if (probe != null)
return probe.isEnabled();
return hasListeners;
}
use of org.glassfish.flashlight.provider.FlashlightProbe in project Payara by payara.
the class BtraceClientGenerator method generateBtraceClientClassData.
public static byte[] generateBtraceClientClassData(int clientID, Collection<FlashlightProbe> probes) {
// create a unique name. It does not matter what the name is.
String generatedClassName = "com/sun/btrace/flashlight/BTrace_Flashlight_" + clientID;
// Start of writing a class using ASM, which will be our BTrace Client
int cwFlags = ClassWriter.COMPUTE_FRAMES + ClassWriter.COMPUTE_MAXS;
ClassWriter cw = new ClassWriter(cwFlags);
// Define the access identifiers for the BTrace Client class
int access = Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL;
cw.visit(Opcodes.V1_5, access, generatedClassName, null, "java/lang/Object", null);
// Need a @OnMethod annotation, so prepare your Annotation Visitor for that
cw.visitAnnotation("Lcom/sun/btrace/annotations/BTrace;", true);
// Iterate through the probes, so you will create one method for each probe
int methodCounter = 0;
for (FlashlightProbe probe : probes) {
// Preparing the class method header and params (type) for @OnMethod annotation
StringBuilder typeDesc = new StringBuilder("void ");
StringBuilder methodDesc = new StringBuilder("void __");
methodDesc.append(probe.getProviderJavaMethodName()).append("__");
methodDesc.append(clientID).append("_").append(methodCounter).append("_");
methodDesc.append("(");
typeDesc.append("(");
String delim = "";
String typeDelim = "";
Class[] paramTypes = probe.getParamTypes();
for (int index = 0; index < paramTypes.length; index++) {
Class paramType = paramTypes[index];
methodDesc.append(delim).append(paramType.getName());
// Dont add the param type for type desc, if self is the first index
if (!(probe.hasSelf() && (index == 0))) {
typeDesc.append(typeDelim).append(paramType.getName());
typeDelim = ",";
}
delim = ", ";
}
methodDesc.append(")");
typeDesc.append(")");
// Creating the class method
Method m = Method.getMethod(methodDesc.toString());
GeneratorAdapter gen = new GeneratorAdapter(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, m, null, null, cw);
// Add the @Self annotation
if (probe.hasSelf()) {
String[] paramNames = probe.getProbeParamNames();
for (int index = 0; index < paramNames.length; index++) {
if (paramNames[index].equalsIgnoreCase(FlashlightProbe.SELF)) {
AnnotationVisitor paramVisitor = gen.visitParameterAnnotation(index, "Lcom/sun/btrace/annotations/Self;", true);
paramVisitor.visitEnd();
}
}
}
// Add the @OnMethod annotation to this method
AnnotationVisitor av = gen.visitAnnotation("Lcom/sun/btrace/annotations/OnMethod;", true);
av.visit("clazz", "" + probe.getProviderClazz().getName());
av.visit("method", probe.getProviderJavaMethodName());
av.visit("type", typeDesc.toString());
av.visitEnd();
// Add the body
gen.push(probe.getId());
gen.loadArgArray();
gen.invokeStatic(Type.getType(ProbeRegistry.class), Method.getMethod("void invokeProbe(int, Object[])"));
gen.returnValue();
gen.endMethod();
methodCounter++;
}
BtraceClientGenerator.generateConstructor(cw);
cw.visitEnd();
byte[] classData = cw.toByteArray();
writeClass(classData, generatedClassName);
return classData;
}
use of org.glassfish.flashlight.provider.FlashlightProbe in project Payara by payara.
the class ProviderImplGenerator method generateClassData.
public byte[] generateClassData(FlashlightProbeProvider provider, Class providerClazz, String generatedClassName) {
Type classType = Type.getType(providerClazz);
if (logger.isLoggable(Level.FINE)) {
logger.fine("** classType: " + classType);
logger.fine("** classDesc: " + Type.getDescriptor(providerClazz));
logger.fine("Generating for: " + generatedClassName);
}
generatedClassName = generatedClassName.replace('.', '/');
int cwFlags = ClassWriter.COMPUTE_FRAMES + ClassWriter.COMPUTE_MAXS;
ClassWriter cw = new ClassWriter(cwFlags);
int access = Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL;
String[] interfaces = new String[] { providerClazz.getName().replace('.', '/') };
cw.visit(Opcodes.V1_5, access, generatedClassName, null, "java/lang/Object", interfaces);
for (FlashlightProbe probe : provider.getProbes()) {
Type probeType = Type.getType(FlashlightProbe.class);
int fieldAccess = Opcodes.ACC_PUBLIC;
String fieldName = "_flashlight_" + probe.getProbeName();
cw.visitField(fieldAccess, fieldName, probeType.getDescriptor(), null, null);
}
Type probeType = Type.getType(FlashlightProbe.class);
for (FlashlightProbe probe : provider.getProbes()) {
StringBuilder methodDesc = new StringBuilder();
methodDesc.append("void ").append(probe.getProviderJavaMethodName());
methodDesc.append("(");
String delim = "";
for (Class paramType : probe.getParamTypes()) {
methodDesc.append(delim).append(paramType.getName());
delim = ", ";
}
methodDesc.append(")");
Method m = Method.getMethod(methodDesc.toString());
GeneratorAdapter gen = new GeneratorAdapter(Opcodes.ACC_PUBLIC, m, null, null, cw);
String fieldName = "_flashlight_" + probe.getProbeName();
gen.loadThis();
gen.visitFieldInsn(Opcodes.GETFIELD, generatedClassName, fieldName, probeType.getDescriptor());
int index = gen.newLocal(probeType);
gen.storeLocal(index);
gen.loadLocal(index);
gen.invokeVirtual(probeType, Method.getMethod("boolean isEnabled()"));
gen.push(true);
Label enabledLabel = new Label();
Label notEnabledLabel = new Label();
gen.ifCmp(Type.getType(boolean.class), GeneratorAdapter.EQ, enabledLabel);
gen.goTo(notEnabledLabel);
gen.visitLabel(enabledLabel);
gen.loadLocal(index);
gen.loadArgArray();
gen.invokeVirtual(probeType, Method.getMethod("void fireProbe(Object[])"));
gen.visitLabel(notEnabledLabel);
gen.returnValue();
gen.endMethod();
}
generateConstructor(cw, generatedClassName, provider);
cw.visitEnd();
byte[] classData = cw.toByteArray();
int index = generatedClassName.lastIndexOf('.');
String clsName = generatedClassName.substring(index + 1);
if (Boolean.parseBoolean(System.getenv("AS_DEBUG"))) {
if (logger.isLoggable(Level.FINE))
logger.fine("Generated ClassDATA " + clsName);
// the path is horribly long. Let's just write t directly into the
// lib dir. It is not for loading as a class but just for us humans
// to decompile to figure out what is going on. No need to make it even harder!
clsName = clsName.replace('.', '/');
// just in case Windows? unlikely...
clsName = clsName.replace('\\', '/');
index = clsName.lastIndexOf("/");
if (index >= 0)
clsName = clsName.substring(index + 1);
FileOutputStream fos = null;
try {
String rootPath = System.getProperty(SystemPropertyConstants.INSTALL_ROOT_PROPERTY) + File.separator + "lib" + File.separator;
String fileName = rootPath + clsName + ".class";
if (logger.isLoggable(Level.FINE))
logger.fine("ClassFile: " + fileName);
File file = new File(fileName);
if (FileUtils.mkdirsMaybe(file.getParentFile())) {
fos = new FileOutputStream(file);
fos.write(classData);
fos.flush();
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (fos != null)
fos.close();
} catch (Exception e) {
// nothing can be done...
}
}
}
return classData;
}
use of org.glassfish.flashlight.provider.FlashlightProbe in project Payara by payara.
the class FlashlightProbeClientMediator method transformProbes.
@Override
public void transformProbes(Object listener, List<FlashlightProbe> probes) {
if (probes.isEmpty())
return;
int clientID = clientIdGenerator.incrementAndGet();
clients.put(clientID, listener);
for (FlashlightProbe probe : probes) {
Class clz = probe.getProviderClazz();
ProbeProviderClassFileTransformer transformer = ProbeProviderClassFileTransformer.getInstance(clz);
try {
transformer.addProbe(probe);
} catch (Exception ex) {
logger.log(Level.SEVERE, BAD_TRANSFORM, ex);
}
}
ProbeProviderClassFileTransformer.transformAll();
}
use of org.glassfish.flashlight.provider.FlashlightProbe in project Payara by payara.
the class FlashlightProbeClientMediator method registerJavaListener.
private void registerJavaListener(Object listener, List<ProbeClientMethodHandle> pcms, List<FlashlightProbe> probesRequiringClassTransformation, String invokerId) {
List<MethodProbe> methodProbePairs = handleListenerAnnotations(listener.getClass(), invokerId);
if (methodProbePairs.isEmpty()) {
return;
}
for (MethodProbe mp : methodProbePairs) {
FlashlightProbe probe = mp.probe;
ProbeClientInvoker invoker = ProbeClientInvokerFactory.createInvoker(listener, mp.method, probe);
ProbeClientMethodHandleImpl hi = new ProbeClientMethodHandleImpl(invoker.getId(), invoker, probe);
pcms.add(hi);
if (probe.addInvoker(invoker))
probesRequiringClassTransformation.add(probe);
}
}
Aggregations