Sergey, thanks, I’ve reviewed and merged corrections directly into ignite-5072-merge. Don’t miss them when the branch will be synched up with ignite-2.0.
However, these are some of the opened questions: * Ignite.memoryMetrics() returns a collection of metrics. However, it’s unclear what exactly the collection includes. Is every element of the collection is a latest snapshot of a specific memory region defined by memory policy and the the total size of the collection is equal to the total number of such regions configured on a node? This has to be clarified in java doc before 2.0 release. * I would have Ignite.memoryMetrics(name) methods that will return the metrics for a concrete region configured by memory policy. It’s fine to add the method under 2.1 (create a ticket). * I would add “setRateInterval” and “setSubIntervals” methods to MemoryPolicyConfiguration because now I have to get a JMX bean if to want to change the parameter. Again, feel free do this under 2.0 or move to 2.1 if there is no time for that. — Denis > On Apr 27, 2017, at 5:36 AM, Sergey Chugunov <sergey.chugu...@gmail.com> > wrote: > > Denis, > > I added javadoc for MemoryMetrics in the commit cee78f47 > <https://github.com/apache/ignite/commit/cee78f47d132001f56c749103f2d8ff7e6c56aa2> > in ignite-5072-merge > <https://github.com/apache/ignite/compare/ignite-5072-merge> branch. > > Could you please review it? I would like to have a feedback and improve > documentation if necessary. > > Thanks, > Sergey > > On Wed, Apr 26, 2017 at 8:08 PM, Denis Magda <dma...@apache.org> wrote: > >> Sergey, >> >>> There is no such thing as a "whole page memory", just look at the code. >>> PageMemoryNoStoreImpl in AI manages single memory region (although >>> expandable); and each MemoryPolicy has one and only one >>> PageMemoryNoStoreImpl instance associated with it. >> >> >> Under the “whole page memory” I meant all the regions defined by all the >> memory policies set up. I still think that it’s reasonable to have the >> metrics for the “whole page memory” so that people can see total memory >> consumption, etc. However, let’s put this off till 2.1. This should be an >> easy thing to add in the future. >> >>> One more thing I cannot avoid mentioning is that the whole situation >> around >>> interface inconsistency raised from huge lacks in documentation about >>> metrics in AI in general. I haven't found any javadocs or wikis >> describing >>> overall architecture of metrics gathering in Ignite, how they are exposed >>> to users or what are use cases. And I still don't have a full picture of >>> this. >> >> Yes, there is a gap in here. We will start improving the situation with >> this ticket: >> https://issues.apache.org/jira/browse/IGNITE-4963 < >> https://issues.apache.org/jira/browse/IGNITE-4963> >> >> — >> Denis >> >>> On Apr 26, 2017, at 7:07 AM, Sergey Chugunov <sergey.chugu...@gmail.com> >> wrote: >>> >>> Denis, >>> >>> There is no such thing as a "whole page memory", just look at the code. >>> PageMemoryNoStoreImpl in AI manages single memory region (although >>> expandable); and each MemoryPolicy has one and only one >>> PageMemoryNoStoreImpl instance associated with it. >>> >>> Each MemoryMetricsImpl is aimed to collect metrics from one MemoryPolicy >>> (allocations, evictions, etc.) on local node. I'll reflect this in >>> documentation for sure and ask you and other people to review it. >>> >>> One more thing I cannot avoid mentioning is that the whole situation >> around >>> interface inconsistency raised from huge lacks in documentation about >>> metrics in AI in general. I haven't found any javadocs or wikis >> describing >>> overall architecture of metrics gathering in Ignite, how they are exposed >>> to users or what are use cases. And I still don't have a full picture of >>> this. >>> So if there are any experts who know more than me, I think it is a must >> for >>> them to share their knowledge with community somewhere in javadoc or >> other >>> easily accessible place. >>> >>> Thanks, >>> Sergey. >>> >>> On Tue, Apr 25, 2017 at 8:46 PM, Denis Magda <dma...@apache.org> wrote: >>> >>>> Totally agree with all Pavel’s and Vovan's suggestions and concerns, >>>> especially, with the following: >>>> >>>>> 2) MemoryMetrics has methods that modify state, like enableMetrics >>>>> and rateTimeInterval >>>>> (IgniteCache.metrics() returns a read-only serializable snapshot) >>>>> >>>>> 3) getSize method returns size in megabytes >>>>> (IgniteCache.metrics() provides sizes in bytes) >>>> >>>> In general, it’s unclear how to use it and the javadoc doesn’t explain >>>> whether these are the metrics for a pool/region/block defined by memory >>>> policy or the whole page memory available to a node will be monitored. >>>> Please mention all that in the javadoc and don’t refer to internal >> classes >>>> like PageMemory and FreeList the documentation. >>>> >>>> — >>>> Denis >>>> >>>>> On Apr 25, 2017, at 12:23 AM, Pavel Tupitsyn <ptupit...@apache.org> >>>> wrote: >>>>> >>>>> Can you give an example of such API usage? >>>>> A piece of code to enable metrics and retrieve a snapshot? >>>>> >>>>> On Mon, Apr 24, 2017 at 8:06 PM, Alexey Goncharuk < >>>>> alexey.goncha...@gmail.com> wrote: >>>>> >>>>>> Agree, I overlooked this during the review. However, the changes to >> fix >>>>>> this is pretty simple - we just move all mutator methods to MBean, >> like >>>>>> Vladimir suggested and make MBean return the live data, while the >> public >>>>>> API will return a serializable snapshot. >>>>>> >>>>>> Agreed? >>>>>> >>>>>> 2017-04-24 19:33 GMT+03:00 Vladimir Ozerov <voze...@gridgain.com>: >>>>>> >>>>>>> It seems that all mutator methods should be simply moved to MBean >>>>>> interface >>>>>>> and change MBytes to bytes. In this case metrics interface will be >>>>>>> consistent. >>>>>>> >>>>>>> On Mon, Apr 24, 2017 at 7:29 PM, Vladimir Ozerov < >> voze...@gridgain.com >>>>> >>>>>>> wrote: >>>>>>> >>>>>>>> Sergey, >>>>>>>> >>>>>>>> We need to keep API consistent. If we usually return bytes, then >> these >>>>>>>> metrics should return bytes as well. What is more important, when I >>>>>> look >>>>>>> at >>>>>>>> API I understand that this thing is not metrics at all. Metrics in >>>>>> Ignte >>>>>>>> terms is a set of read-only numeric properties. But this interface >>>>>>> contains >>>>>>>> strange things like "name", "swapPilePath". What even more strange, >> I >>>>>> do >>>>>>>> not see how to get these metrics from public API. >>>>>>>> >>>>>>>> All in all, looks like this entity is not "metrics", but "MBean" in >>>>>> usual >>>>>>>> Ignite terms. >>>>>>>> >>>>>>>> Vladimir. >>>>>>>> >>>>>>>> On Mon, Apr 24, 2017 at 7:20 PM, Pavel Tupitsyn < >> ptupit...@apache.org >>>>> >>>>>>>> wrote: >>>>>>>> >>>>>>>>> Sergey, I disagree. >>>>>>>>> >>>>>>>>> 1) As a user, I would expect MemoryMetrics instance to be >>>>>>>>> read-only and serializable, so I can send it somewhere, store, >>>>>>>>> put into a collection and draw a graph in UI, etc. >>>>>>>>> >>>>>>>>> Other metrics APIs allow this, MemoryMetrics does not. >>>>>>>>> >>>>>>>>> 2) Methods like enableMetrics and rateTimeInterval placed in >>>>>>> MemoryMetrics >>>>>>>>> break single responsibility principle and are confusing. >>>>>>>>> Why do I need to Get metrics to Enable them? >>>>>>>>> >>>>>>>>> These methods should be placed somewhere else. >>>>>>>>> >>>>>>>>> I would suggest some thing like this: >>>>>>>>> - introduce Memory class with getMetrics, enableMetrics, >>>>>>>>> setRateTimeInterval, etc >>>>>>>>> - add Ignite.getMemory method >>>>>>>>> >>>>>>>>> >>>>>>>>> On Mon, Apr 24, 2017 at 6:53 PM, Sergey Chugunov < >>>>>>>>> sergey.chugu...@gmail.com> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> I guess the main reason to have IgniteCache returning snapshot >>>>>> metrics >>>>>>>>> was >>>>>>>>>> to collect metrics about distributed cache across the cluster. >>>>>>>>>> At the same time MemoryMetrics were initially designed to be local >>>>>> on >>>>>>>>> each >>>>>>>>>> node, there were no requirements about collecting cluster-wide >>>>>>>>>> MemoryMetrics. >>>>>>>>>> >>>>>>>>>> Collecting MemoryMetrics is considered as an investigation action >>>>>> when >>>>>>>>>> something goes wrong, that's why it was decided to add >>>>>> enable/disable >>>>>>>>>> actions to the interface. >>>>>>>>>> So for me it sounds reasonable. >>>>>>>>>> >>>>>>>>>> The only debatable thing is having MemoryMetrics returning size in >>>>>>>>>> megabytes, however I think about these metrics as designed only >> for >>>>>>>>> user, >>>>>>>>>> so I think it makes sense to return this metric in human-readable >>>>>>> form. >>>>>>>>>> >>>>>>>>>> On Mon, Apr 24, 2017 at 6:41 PM, Vladimir Ozerov < >>>>>>> voze...@gridgain.com> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>>> Agree, looks inconsistent to me. >>>>>>>>>>> >>>>>>>>>>> Alex G., could you chime in? >>>>>>>>>>> >>>>>>>>>>> On Mon, Apr 24, 2017 at 6:30 PM, Pavel Tupitsyn < >>>>>>> ptupit...@apache.org >>>>>>>>>> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> Igniters, >>>>>>>>>>>> >>>>>>>>>>>> I have noticed quite a lot of inconsistencies with the rest of >>>>>> our >>>>>>>>> APIs >>>>>>>>>>> in >>>>>>>>>>>> our new MemoryMetrics API: >>>>>>>>>>>> >>>>>>>>>>>> 1) MemoryMetrics is not a snapshot. It is a "live" instance >>>>>> which >>>>>>>>>> returns >>>>>>>>>>>> different values each time you access some property. >>>>>>>>>>> (IgniteCache.metrics() >>>>>>>>>>>> returns a snapshot). >>>>>>>>>>>> >>>>>>>>>>>> 2) MemoryMetrics has methods that modify state, like >>>>>> enableMetrics >>>>>>>>>>>> and rateTimeInterval >>>>>>>>>>>> (IgniteCache.metrics() returns a read-only serializable >>>>>> snapshot) >>>>>>>>>>>> >>>>>>>>>>>> 3) getSize method returns size in megabytes >>>>>>>>>>>> (IgniteCache.metrics() provides sizes in bytes) >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> I propose to rework this API until it is not too late. >>>>>>>>>>>> >>>>>>>>>>>> Thoughts? >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>> >>>> >> >>