As far as I can tell, the things that execute functions use the public API to find the function to execute. So if we unwrap the functions in the public API, only the un-instrumented functions will be executed.
— Dale Emery dem...@pivotal.io > On Sep 11, 2019, at 1:38 PM, Dan Smith <dsm...@pivotal.io> wrote: > > I think you could still use your decorator approach if you also unwrap the > Functions when returning them from the public APIs like getFunction etc. In > that case your TimingFunction could probably safely by added to > excludedClasses.txt. > > You will miss collecting metrics about functions that aren't registered and > are invoked using Execution.execute(Function) but maybe that's intentional? > > -Dan > > On Wed, Sep 11, 2019 at 1:24 PM Mark Hanson <mhan...@pivotal.io> wrote: > >> They would be the specific functions, but this doesn’t get us around they >> other problem. I think this approach is not going to work and we are about >> to start looking into other ways. >> >> Thanks, >> Mark >> >>> On Sep 11, 2019, at 12:14 PM, Anthony Baker <aba...@pivotal.io> wrote: >>> >>> I think the Decorator approach you outlined could have other impacts as >> well. Would I still be able to see specific function executions in >> statistics or would they all become “TImingFunction”? >>> >>> Anthony >>> >>> >>>> On Sep 11, 2019, at 12:00 PM, Aaron Lindsey <alind...@pivotal.io> >> wrote: >>>> >>>> Thanks for your response, Dan. >>>> >>>> The second scenario you mentioned (i.e. users calling >>>> FunctionService.getFunction(String)) worries me because our PR changes >> the >>>> FunctionService so they would now get back an instance of the decorator >>>> function instead of the specific instance they registered by calling >>>> FunctionService.registerFunction(Function). Therefore, any explicit >> casts >>>> to a Function implementation like (MyFunction) >>>> FunctionService.getFunction("MyFunction") would fail. Does that mean >> this >>>> be a breaking change? The FunctionService class does not specify that >>>> getFunction must return the same type function as the one passed to >>>> registerFunction, but I could see how users might be relying on that >>>> behavior since there is no other way to get a specific function type >> out of >>>> the FunctionService without doing a cast. >>>> >>>> - Aaron >>>> >>>> >>>> On Wed, Sep 11, 2019 at 10:52 AM Dan Smith <dsm...@pivotal.io> wrote: >>>> >>>>> Functions are serialized when you call Execution.execute(Function) >> instead >>>>> of Execution.execute(String). Invoking execute on a function object >>>>> serializes the function and executes it on the remote side. Functions >>>>> executed this way don't have be registered. >>>>> >>>>> Users can also get registered function objects directly from the >> function >>>>> service using FunctionService.getFunction(String) and do whatever they >> want >>>>> with them, which I guess could include serializing them. >>>>> >>>>> Hope that helps! >>>>> -Dan >>>>> >>>>> On Wed, Sep 11, 2019 at 10:27 AM Aaron Lindsey <alind...@pivotal.io> >>>>> wrote: >>>>> >>>>>> As part of a PR to add Micrometer timers for function executions >>>>>> <https://github.com/apache/geode/pull/4038>, we implemented a >> decorator >>>>>> Function that wraps all registered non-internal functions and adds >>>>>> instrumentation. This PR is >>>>>> failing AnalyzeSerializablesJUnitTest.testSerializables because the >>>>>> decorator class is a new Serializable. >>>>>> >>>>>> I'm not sure if it would be OK to add this class to >> excludedClasses.txt >>>>>> because I don't know whether this function will ever be serialized. >> If it >>>>>> will be serialized, then I'm concerned that this might break backwards >>>>>> compatibility because we're changing the serialized form of registered >>>>>> functions. If this is the case, then we could implement custom logic >> for >>>>>> serializing the decorator class which would replace its serialized >> form >>>>>> with the serialized form of the inner class. Again, I'm not sure if >> that >>>>>> would be necessary because I don't know the conditions under which a >>>>>> function would be serialized. >>>>>> >>>>>> Could someone help me understand when functions would be persisted or >>>>> sent >>>>>> over the wire so I can determine if this change would break >>>>> compatibility? >>>>>> >>>>>> Thanks, >>>>>> Aaron >>>>>> >>>>> >>> >> >>