Hi Pablo,

thx for the pointers. I'll have a look into it and let you know.

Regards,

michel

On Wed, May 10, 2017 at 3:18 AM, Pablo Estrada <[email protected]> wrote:

> Hi Michael,
> I'm sorry. I see I did not read your first email properly.
>
> There are a couple places in the core SDK or runner code and tests that
> used to use aggregators, and now use metrics. There are two reasonable
> options for this:
> 1. In [1], the test sets up the metrics global environment by setting the
> current container (e.g.  MetricsEnvironment.setCurrentContainer(new
> MetricsContainer("anystep"));), and the LateDataFilter uses metrics
> normally[2], by creating a counter that relies on the environment set up in
> the test.
>
> 2. If you'd rather not rely on setting up a global environment, you can
> use CounterCell, and pass it in to your test. In [3] it's not a test, but a
> CounterCell is still created to keep internal statistics, and later its
> value is checked [4]. As a note, you may note in [3] that CounterCells are
> a bit quirky to create, as we did not intend for external users to be able
> to create them.
>
> Let me know if these suggestions are helpful.
> Best
> -P.
>
> [1] - https://github.com/apache/beam/blob/master/runners/core-
> java/src/test/java/org/apache/beam/runners/core/
> LateDataDroppingDoFnRunnerTest.java#L61
> [2] - https://github.com/apache/beam/blob/master/runners/core-
> java/src/main/java/org/apache/beam/runners/core/
> LateDataDroppingDoFnRunner.java#L96
> [3] - https://github.com/apache/beam/blob/master/runners/
> spark/src/main/java/org/apache/beam/runners/spark/stateful/
> SparkGroupAlsoByWindowViaWindowSet.java#L210
> [4] - https://github.com/apache/beam/blob/master/runners/
> spark/src/main/java/org/apache/beam/runners/spark/stateful/
> SparkGroupAlsoByWindowViaWindowSet.java#L326
>
> On Tue, May 9, 2017 at 4:33 PM Michael Luckey <[email protected]> wrote:
>
>> Hi Pablo,
>>
>> thanks for your help! We certainly could change our testing code and
>> involve execution of a pipeline during tests.
>>
>> But currently we are leveraging DoFnTester, i.e. scoping our tests to the
>> DoFn only, which means, there is neither a pipeline nor a pipeline result
>> involved, which i could call upon.
>>
>> It might be a bad idea trying to test counters on this basis, but as it
>> was supported previously i thought we might have overlooked an API for
>> accessing these metrics somehow within DoFnTesting. Not sure, wether it
>> makes sense for the DoFnTester to somehow provide Metrics-Support to enable
>> this kind of tests. I certainly do not like the idea to much starting to do
>> some mocking of the metrics api within my test implementation.
>>
>> Regards,
>>
>> michel
>>
>>
>> On Wed, May 10, 2017 at 1:10 AM, Pablo Estrada <[email protected]>
>> wrote:
>>
>>> Hi Michael,
>>> For the Metrics API, the way to programatically query the value of a
>>> metric is by using the MetricResults.queryMetrics method. You get the
>>> MetricResults object from the PipelineResult object, and query it like so:
>>>
>>> PipelineResult res = p.run();
>>> MetricQueryResults metricResult = res.metrics().queryMetrics(....);
>>>
>>> The queryMetrics method takes in a MetricsFilter instance.
>>>
>>> Not all runners support this operation. For the dataflow runner, PR
>>> 2896[1] should add it.
>>>
>>> Let me know if you need more help with this.
>>> Best
>>> -P.
>>>
>>> [1] - https://github.com/apache/beam/pull/2896
>>>
>>> On Tue, May 9, 2017 at 3:48 PM Michael Luckey <[email protected]>
>>> wrote:
>>>
>>>> Hi,
>>>>
>>>> currently we are evaluating a migration from 0.6.0 to current. We
>>>> encountered the following problem, which we currently not sure, how to best
>>>> solve.
>>>>
>>>> Say we have a DoFn, which is using Aggregators, e.g.
>>>>
>>>>         ctr = createAggregator("someCounter", Sum.ofLongs());
>>>>
>>>>  We were testing them with DoFn-Tester like
>>>>
>>>>         final DoFnTester<Record, Record> doFnTester =
>>>> DoFnTester.of(fixture);
>>>>         doFnTester.processElement(input);
>>>>
>>>>          assertThat(doFnTester.getAggregatorValue(fixture.ctr).longValue(),
>>>> is(1L));
>>>>
>>>> As aggregators are removed now from the codebase, we are considering
>>>> using Metrics instead. But we did not find an equivalent to the
>>>> getAggregatorValue method on DoFnTester.
>>>>
>>>> Any suggestion how we could keep our counters tested within a unit test
>>>> based on DoFnTester? Or do we have to find a completely different solution?
>>>> Are we doing something completely wrong trying to test correct workings of
>>>> our counters with this approach?
>>>>
>>>> Regards,
>>>>
>>>> michel
>>>>
>>>>
>>>>
>>

Reply via email to