@Advice.OnMethodEnter(inline = false) public static void monitorStart(@ParameterNames String parameterNames, @Advice.AllArguments Object[] args, @RequestName String requestName, @Advice.Origin("#t") String className, @Advice.Origin("#m") String methodName, @Advice.This(optional = true) Object thiz) { final String[] paramNames = parameterNames.split(","); Map<String, Object> params = new LinkedHashMap<String, Object>(); for (int i = 0; i < args.length; i++) { params.put(paramNames[i], args[i]); } final MonitoredMethodRequest monitoredRequest = new MonitoredMethodRequest(Stagemonitor.getConfiguration(), requestName, null, params); final TracingPlugin tracingPlugin = Stagemonitor.getPlugin(TracingPlugin.class); tracingPlugin.getRequestMonitor().monitorStart(monitoredRequest); final Span span = TracingPlugin.getCurrentSpan(); if (requestName == null) { span.setOperationName(getBusinessTransationName(thiz != null ? thiz.getClass().getName() : className, methodName)); } span.setTag(MetricsSpanEventListener.ENABLE_TRACKING_METRICS_TAG, true); }
/** * {@inheritDoc} */ public OffsetMapping make(ParameterDescription.InDefinedShape target, AnnotationDescription.Loadable<AllArguments> annotation, AdviceType adviceType) { if (!target.getType().represents(Object.class) && !target.getType().isArray()) { throw new IllegalStateException("Cannot use AllArguments annotation on a non-array type"); } else if (adviceType.isDelegation() && !annotation.loadSilent().readOnly()) { throw new IllegalStateException("Cannot define writable field access for " + target); } else { return new ForAllArguments(target.getType().represents(Object.class) ? TypeDescription.Generic.OBJECT : target.getType().getComponentType(), annotation.loadSilent()); } } }
@OnMethodEnter(skipOn = OnNonDefaultValue.class) private static Callable<?> enter( @ProxyAdviceId long id, @This Object self, @Origin final Method method, @AllArguments final Object[] arguments ) throws Throwable { // workaround for #35 if (self.getClass() == HashMap.class) { if (arguments.length == 1 && arguments[0] == HashMap.class) { return null; } if (arguments.length == 2 && arguments[1] == HashMap.class) { return null; } } JvmMockKDispatcher dispatcher = JvmMockKDispatcher.get(id, self); if (dispatcher == null) { return null; } return dispatcher.handler(self, method, arguments); }
@OnMethodExit(onThrowable = Throwable.class) public static void after( @Enter List<Object> hooks, @This(optional = true) Object that, @Origin Method method, @AllArguments Object[] args, @Return(typing = Assigner.Typing.DYNAMIC) Object returned, // support void == null and int == Integer @Thrown Throwable thrown ) { try { // The following code is equivalent to: // Delegator.after(hooks, method, args); // However, the Delegator class will not be available in the context of the instrumented method, // so we must use our agent class loader to load the Delegator class and do the call via reflection. Class<?> delegator = ClassLoaderCache.getInstance().currentClassLoader().loadClass("io.promagent.internal.Delegator"); Method afterMethod = delegator.getMethod("after", List.class, Method.class, Object[].class, Object.class, Throwable.class); afterMethod.invoke(null, hooks, method, args, returned, thrown); } catch (Exception e) { Class<?> clazz = that != null ? that.getClass() : method.getDeclaringClass(); System.err.println("Error executing Prometheus hook on " + clazz.getSimpleName()); e.printStackTrace(); } } }
@OnMethodEnter @SuppressWarnings("unchecked") public static List<Object> before( @This(optional = true) Object that, @Origin Method method, @AllArguments Object[] args ) { // that is null when instrumenting static methods. Class<?> clazz = that != null ? that.getClass() : method.getDeclaringClass(); try { // The following code is equivalent to: // return Delegator.before(that, method, args); // However, the Delegator class will not be available in the context of the instrumented method, // so we must use our agent class loader to load the Delegator class and do the call via reflection. Class<?> delegator = ClassLoaderCache.getInstance().currentClassLoader().loadClass("io.promagent.internal.Delegator"); Method beforeMethod = delegator.getMethod("before", Class.class, Method.class, Object[].class); return (List<Object>) beforeMethod.invoke(null, clazz, method, args); } catch (Exception e) { System.err.println("Error executing Prometheus hook on " + clazz.getSimpleName()); e.printStackTrace(); return null; } }
@OnMethodEnter(skipOn = OnNonDefaultValue.class) private static Callable<?> enter(@MockKProxyAdviceId long id, @This Object self, @Origin final Method method, @AllArguments final Object[] arguments) throws Throwable { // workaround for #35 if (self.getClass() == HashMap.class) { if (arguments.length == 1 && arguments[0] == HashMap.class) { return null; } if (arguments.length == 2 && arguments[1] == HashMap.class) { return null; } } MockKDispatcher dispatcher = MockKDispatcher.get(id, self); if (dispatcher == null) { return null; } return dispatcher.handle(self, method, arguments); }
@Advice.OnMethodEnter(inline = false) public static void monitorStart(@ParameterNames String parameterNames, @Advice.AllArguments Object[] args, @RequestName String requestName, @Advice.Origin("#t") String className, @Advice.Origin("#m") String methodName, @Advice.This(optional = true) Object thiz) { final String[] paramNames = parameterNames.split(","); Map<String, Object> params = new LinkedHashMap<String, Object>(); for (int i = 0; i < args.length; i++) { params.put(paramNames[i], args[i]); } final MonitoredMethodRequest monitoredRequest = new MonitoredMethodRequest(Stagemonitor.getConfiguration(), requestName, null, params); final RequestMonitorPlugin requestMonitorPlugin = Stagemonitor.getPlugin(RequestMonitorPlugin.class); requestMonitorPlugin.getRequestMonitor().monitorStart(monitoredRequest); final RequestTrace request = RequestMonitor.get().getRequestTrace(); if (requestName == null && request != null) { request.setName(getBusinessTransationName(thiz != null ? thiz.getClass().getName() : className, methodName)); } }
@SuppressWarnings({"unchecked", "ParameterCanBeLocal", "RedundantThrows"}) @Advice.OnMethodEnter(skipOn = Advice.OnNonDefaultValue.class) static boolean onMethodEnter( @Execution MethodExecution.Implementation getExec, @Advice.Local("exec") MethodExecution.Implementation exec, @Advice.Local("event") MethodEvent event, @Advice.This(optional = true) Object instance, @Advice.AllArguments(readOnly = false, typing = Assigner.Typing.DYNAMIC) Object[] arguments ) throws Throwable { exec = getExec; if (!exec.hasObservers()) return false; event = new MethodEvent(instance, arguments); exec._enter.accept(event); //noinspection UnusedAssignment arguments = event.arguments; return event.skipBody; }
@OnMethodEnter(skipOn = OnNonDefaultValue.class) private static Callable<?> enterStatic(@ProxyAdviceId long id, @Origin final Method method, @AllArguments final Object[] arguments) throws Throwable { if (arguments.length == 1 && arguments[0] == HashMap.class) { return null; } Object self = method.getDeclaringClass(); JvmMockKDispatcher dispatcher = JvmMockKDispatcher.get(id, self); if (dispatcher == null) { return null; } return dispatcher.handler(self, method, arguments); }
@Advice.OnMethodExit private static void exit( @ProxyAdviceId long id, @Advice.This Object self, @Advice.AllArguments final Object[] arguments ) { JvmMockKDispatcher dispatcher = JvmMockKDispatcher.get(id, self); if (dispatcher == null) { return; } dispatcher.constructorDone(self, arguments); } }
/** * 如果需要返回值,在方法里添加注解和参数@Advice.Return(readOnly = false) Object result,result的类型要和实际返回值类型一致,需要修改参数readOnly置为false */ @Advice.OnMethodExit(onThrowable = Throwable.class) public static void exit(@Advice.Local("handler") IHandler handler, @Advice.Origin Method method, @Advice.This Object instance, @Advice.AllArguments Object[] allArguments, @Advice.Thrown Throwable t){ //TODO This is a demo ! } }
/** * 如果需要返回值,在方法里添加注解和参数@Advice.Return(readOnly = false) Object result,result的类型要和实际返回值类型一致,需要修改参数readOnly置为false */ @Advice.OnMethodExit(onThrowable = Throwable.class) public static void exit(@Advice.Local("handler") IHandler handler, @Advice.Origin Method method, @Advice.Origin Class<?> clazz, @Advice.AllArguments Object[] allArguments, @Advice.Thrown Throwable t){ //TODO This is a demo ! } }
@OnMethodEnter(skipOn = OnNonDefaultValue.class) private static Callable<?> enterStatic(@MockKProxyAdviceId long id, @Origin final Method method, @AllArguments final Object[] arguments) throws Throwable { if (arguments.length == 1 && arguments[0] == HashMap.class) { return null; } Object self = method.getDeclaringClass(); MockKDispatcher dispatcher = MockKDispatcher.get(id, self); if (dispatcher == null) { return null; } return dispatcher.handle(self, method, arguments); }
@Advice.OnMethodEnter() public static void enter(@Advice.Local("handler") IHandler handler, @Advice.Origin Method method, @Advice.This Object instance, @Advice.AllArguments Object[] allArguments){ //TODO This is a demo ! }
@Advice.OnMethodEnter() public static void enter(@Advice.Local("handler") IHandler handler, @Advice.Origin Method method, @Advice.Origin Class<?> clazz, @Advice.AllArguments Object[] allArguments){ //TODO This is a demo ! }
@OnMethodEnter(skipOn = OnNonDefaultValue.class) private static Callable<?> enterStatic(@ProxyAdviceId long id, @Origin final Method method, @AllArguments final Object[] arguments) throws Throwable { Object self = method.getDeclaringClass(); JvmMockKDispatcher dispatcher = JvmMockKDispatcher.get(id, self); if (dispatcher == null) { return null; } return dispatcher.handler(self, method, arguments); }
@OnMethodEnter(skipOn = OnNonDefaultValue.class) private static Callable<?> enterStatic(@MockKProxyAdviceId long id, @Origin final Method method, @AllArguments final Object[] arguments) throws Throwable { Object self = method.getDeclaringClass(); MockKDispatcher dispatcher = MockKDispatcher.get(id, self); if (dispatcher == null) { return null; } return dispatcher.handle(self, method, arguments); }
@SuppressWarnings("unused") @Advice.OnMethodEnter(skipOn = Advice.OnNonDefaultValue.class) private static Callable<?> enter(@Identifier String identifier, @Advice.This Object mock, @Advice.Origin Method origin, @Advice.AllArguments Object[] arguments) throws Throwable { MockMethodDispatcher dispatcher = MockMethodDispatcher.get(identifier, mock); if (dispatcher == null || !dispatcher.isMocked(mock) || dispatcher.isOverridden(mock, origin)) { return null; } else { return dispatcher.handle(mock, origin, arguments); } }
/** * Creates a new offset mapping for an array containing all arguments. * * @param target The component target type. * @param annotation The mapped annotation. */ protected ForAllArguments(TypeDescription.Generic target, AllArguments annotation) { this(target, annotation.readOnly(), annotation.typing()); }