So the proposed change will not actually fix the issue with metrics, because it's still possible to get a local instance via the service() method. At the same time, the change removes an existing performance optimization.
Let's figure out how to fix the actual problem. If the *only* way to have metrics is to have a proxy, then this should be the only way to interact with a service. In that case, we need to do something with the service() method (deprecate it?). Or probably there are other ways to fix metrics? -Val On Thu, Jan 20, 2022 at 3:32 AM Vladimir Steshin <vlads...@gmail.com> wrote: > Yes. Invocations from direct reference are not measured. This method > in the javadoc: > > > /* <b>NOTE:</b> Statistics are collected only with service proxies > obtaining by methods like/ > > /* {@link IgniteServices#serviceProxy(String, Class, boolean)} and won't > work for direct reference of local/ > > /* services which you can get by, for example, {@link > IgniteServices#service(String)}./ > > > On 20.01.2022 00:20, Valentin Kulichenko wrote: > > BTW, there is also the service() method that can only return an instance > > and never returns a proxy. Does it corrupt the metrics as well? > > > > -Val > > > > On Wed, Jan 19, 2022 at 1:09 PM Valentin Kulichenko < > > valentin.kuliche...@gmail.com> wrote: > > > >> Maxim, > >> > >> The reason I'm asking is that I don't really understand how client side > >> mechanics affect server side metrics (number of executions and their > >> durations). I feel that we might be fixing a wrong problem. > >> > >> Could you elaborate on why we count metrics incorrectly when > >> the serviceProxy() returns an instance of a local service instead of an > >> actual proxy? > >> > >> -Val > >> > >> On Tue, Jan 18, 2022 at 11:32 PM Maksim Timonin<timoninma...@apache.org > > > >> wrote: > >> > >>> Hi, guys! > >>> > >>>> this is not a good idea to change the behavior of serviceProxy() > >>> depending on statistics > >>> > >>> I think that the patch doesn't change the behavior of `serviceProxy()`. > >>> This method promises a proxy and it actually returns it. The fact that > >>> `serviceProxy()` can return non-proxy objects is an internal Ignite > >>> optimization, and users should not rely on this, there is a separate > >>> method > >>> `service()` for that. > >>> > >>>> What are the metrics that are being affected by this? > >>> Only service metrics, that calculates duration of service execution. > Check > >>> this ticket [1] > >>> > >>> [1]https://issues.apache.org/jira/browse/IGNITE-12464 > >>> > >>> > >>> On Wed, Jan 19, 2022 at 1:22 AM Valentin Kulichenko < > >>> valentin.kuliche...@gmail.com> wrote: > >>> > >>>> What are the metrics that are being affected by this? > >>>> > >>>> -Val > >>>> > >>>> On Tue, Jan 18, 2022 at 3:31 AM Вячеслав Коптилин < > >>>> slava.kopti...@gmail.com> > >>>> wrote: > >>>> > >>>>> Hello Igniters, > >>>>> > >>>>> IMHO, this is not a good idea to change the behavior of > serviceProxy() > >>>>> depending on statistics (enabled/disabled). It seems counterintuitive > >>> to > >>>>> me. > >>>>> Perhaps, we need to introduce a new method that should always return > a > >>>>> proxy to the user service. > >>>>> > >>>>> Thanks, > >>>>> Slava. > >>>>> > >>>>> > >>>>> вт, 28 дек. 2021 г. в 13:57, Pavel Pereslegin<xxt...@gmail.com>: > >>>>> > >>>>>> Hi! > >>>>>> > >>>>>> Agree with Maxim. > >>>>>> > >>>>>> It seems to me quite normal to return a proxy for a local instance > >>> in > >>>>>> the case when the user has explicitly enabled statistics collection > >>> in > >>>>>> the service settings. Those. by default, we do not change the > >>> behavior > >>>>>> and if the collection of metrics is not needed, a local instance > >>> will > >>>>>> be returned. And I also think the javadoc should be changed to > >>> reflect > >>>>>> the new behavior. > >>>>>> > >>>>>> So, I'm for 1 + 3. > >>>>>> > >>>>>> вт, 28 дек. 2021 г. в 10:51, Maksim Timonin < > >>> timoninma...@apache.org>: > >>>>>>> Hi! > >>>>>>> > >>>>>>> I agree that users shouldn't expect a non-proxy when invoking the > >>>>>>> `IgniteServices#serviceProxy()` method. I think it's up to Ignite > >>> to > >>>>>> return > >>>>>>> a non-proxy instance here as possible optimisation. But users > >>> have to > >>>>> use > >>>>>>> interfaces in any case. There is the `IgniteServices#service()` > >>>> method > >>>>>> for > >>>>>>> explicit return of local instances. > >>>>>>> > >>>>>>> With enabling of metrics we can break users that explicitly > >>>>>>> use `#serviceProxy` (proxy!), and then explicitly cast it to an > >>>>>>> implementation class. In this case such users will get a runtime > >>>>>> exception. > >>>>>>> I think we can write a good javadoc for > >>>>>>> `ServiceConfiguration#setEnableMetrics()`, it should mention that > >>> it > >>>>>> works > >>>>>>> only with proxy, and it doesn't collect metrics with non-proxy > >>> usages > >>>>>> with > >>>>>>> `IgniteService#service()`. > >>>>>>> > >>>>>>> So, I propose to proceed with two solutions - 1 and 3: fix docs > >>> for > >>>>>>> `#serviceProxy()` and provide detailed javadocs > >>>>>>> for `ServiceConfiguration#setEnableMetrics()`. > >>>>>>> > >>>>>>> If some users will enable metrics (even with such docs!) and will > >>> be > >>>>>> using > >>>>>>> casting proxy(!) to an implementation, then they will get a > >>> runtime > >>>>>>> exception. But I believe that it is an obvious failure, and it > >>> should > >>>>> be > >>>>>>> fixed on the user side. > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> > >>>>>>> On Mon, Dec 27, 2021 at 10:26 PM Vladimir Steshin < > >>>> vlads...@gmail.com> > >>>>>>> wrote: > >>>>>>> > >>>>>>>> Hi, Igniters. > >>>>>>>> > >>>>>>>> > >>>>>>>> I'd like to suggest modifying > >>> `/IgniteServices.serviceProxy(String > >>>>>> name, > >>>>>>>> Class<? super T> svcItf, boolean sticky)/` so that it may return > >>>>> proxy > >>>>>>>> even for local service. Motivation: service metrics [1]. To > >>> measure > >>>>>>>> method call we need to wrap service somehow. Also, the method > >>> name > >>>>> says > >>>>>>>> `proxy`. For local one we return direct instance. Misleading. > >>>>>>>> > >>>>>>>> > >>>>>>>> Solutions: > >>>>>>>> > >>>>>>>> 1) Let’s return a proxy (`/GridServiceProxy/`) once we need. > >>> Let’s > >>>>>>>> change the javadoc to say `@return Proxy over service’. Simply > >>>> works. > >>>>>>>> Pros: invocation like `/MyServiceImpl svc = > >>>> serviceProxy(«myservice», > >>>>>>>> MyService.class)`/ would fail. Wierd usage to me. But possible. > >>>>>>>> > >>>>>>>> 2) Introduce a new method with forced-proxy flag > >>>>>>>> like`IgniteSerives.serviceProxy(…, boolead focedProxy)`. And > >>> add a > >>>>>>>> warning to other service-obtain methods like: «`/You enabled > >>>> service > >>>>>>>> metrics but it doesn’t work for local service instanse. Use > >>>>>> forced-proxy > >>>>>>>> serviceProxy(…, boolean forcedProxy)/` Pros: we’ve already have > >>>> about > >>>>>>>> 5-6 methods to get services in `/IgniteServices/`. I doubt we > >>> need > >>>>> one > >>>>>>>> more. > >>>>>>>> > >>>>>>>> 3) Fix the documentation so that it tells the service metrics > >>> would > >>>>>> work > >>>>>>>> only with proxy. Pros: service metrics just won’t work for local > >>>>>>>> services. Suddenly. > >>>>>>>> > >>>>>>>> > >>>>>>>> My vote is for #1: let's use a proxy. WDYT? > >>>>>>>> > >>>>>>>> > >>>>>>>> [1]https://issues.apache.org/jira/browse/IGNITE-12464 > >>>>>>>> > >>>>>>>>