These are great ideas!  I do love Adam's dynamic relationship idea over
creating a failure relationship that is auto-terminated. This would make
flow migrations in Registry and NiFi easier.

After some more pondering, I (slowly) realized that this problem affects
more than UpdateAttribute, though.  You can easily get expression language
(explang) exceptions anywhere that explang is used.  I'm sure all of us can
create a RouteOnAttribute configuration that causes an explang exception
which rolls back the flowfile.  If we spend so much effort on a solution it
would be a shame for that to only apply to UpdateAttribute.

For this reason I would favor Matt's idea of a try() or trycatch() explang
method.  How it might work isn't intuitive, though.  Would we have to make
it aware of a data type to return?  RouteOnAttribute expects boolean but
UpdateAttribute expects string (or convertible to string).

I can see why the rollback/admin yield solution has been status quo for so
long.

-- Mike




On Fri, Feb 9, 2024 at 10:03 AM u...@moosheimer.com <u...@moosheimer.com>
wrote:

> 👍
> --Uwe
>
> > Am 09.02.2024 um 13:50 schrieb Mike Thomsen <mikerthom...@gmail.com>:
> >
> > How about a third option which is to provide three options:
> >
> > 1) Default - status quo, exceptions cause it to yield
> > 2) Exception = moves forward to success w/ an error attribute, an error
> log
> > statement that triggers a bulletin, etc to let data manages know what's
> > happening.
> > 3) Exception = moves to a failure relationship that is otherwise
> > autoterminated
> >
> >> On Thu, Feb 8, 2024 at 7:12 PM Matt Burgess <mattyb...@apache.org>
> wrote:
> >>
> >> Mike's option #2 seems solid but would take a lot of work and there will
> >> always be inputs we don't account for. I support that work but in code
> >> sometimes we just do a "catch(Throwable)" just so it doesn't blow up.
> What
> >> about a subjectless "try" or "trycatch" function you can wrap around
> your
> >> whole expression? If no exception is thrown, the evaluated value will be
> >> returned but if one is thrown, you can provide some alternate value that
> >> you can check downstream. As this is optional it would retain the
> current
> >> behavior unless you use it, and then it takes the place of all those
> >> ifElse(isXYZValid()) calls we'd need throughout the expression.
> >>
> >> Regards,
> >> Matt
> >>
> >>
> >> On Wed, Feb 7, 2024 at 8:11 PM Phillip Lord <phillord0...@gmail.com>
> >> wrote:
> >>
> >>> IMO... UpdateAttribute has been around since the beginning of time, I
> >> can't
> >>> see adding a failure relationship. At the same time I understand the
> want
> >>> for such exceptions to be handled more gracefully rather than rolling
> >> back
> >>> indefinitely.
> >>> I'd vote in favor of considering Moser's option #2... and being able to
> >>> implement an "if this then that" logic within your flow.
> >>>
> >>> Also just thinking... for every UA failure you have to consider a good
> >>> failure-management strategy, which MIGHT add a lot of noise to the
> flow.
> >>> Something that might otherwise easily be identified in a downstream
> >>> component and/or database/etc.
> >>>
> >>> My 2 cents **
> >>> Phil
> >>>
> >>>
> >>>
> >>>
> >>>
> >>>> On Wed, Feb 7, 2024 at 5:18 PM Adam Taft <a...@adamtaft.com> wrote:
> >>>
> >>>> Or better, the failure relationship just doesn't even exist until the
> >>>> property "Has Failure Relationship" is set to True.  This involves
> >>> updating
> >>>> UpdateAttribute to have dynamic relationships (the failure
> >> relationships
> >>>> appearing on true), which isn't hard to do in processor code.
> >>>>
> >>>> This has the advantage of being backwards compatible for existing
> users
> >>> and
> >>>> allows the failure relationship to exist for new configurations.
> >>> Obviously
> >>>> the processor would need an update to catch Expression Language
> >>> exceptions
> >>>> and then route conditionally to failure.
> >>>>
> >>>> Just thinking out loud.
> >>>> /Adam
> >>>>
> >>>>
> >>>>
> >>>> On Wed, Feb 7, 2024 at 1:48 PM u...@moosheimer.com <u...@moosheimer.com
> >
> >>>> wrote:
> >>>>
> >>>>> Hi Mike,
> >>>>>
> >>>>> How about the option of introducing a new property that decides
> >> whether
> >>>> to
> >>>>> route to the 'failure' relationship in the event of an error?
> >>>>> If this property is set to false, then the 'failure' relationship is
> >>>>> automatically set to 'terminate' (since nothing is routed there
> >>> anyway).
> >>>>>
> >>>>> Then everyone can decide whether and where they want to use this new
> >>>>> feature or not.
> >>>>> All other options would still be possible with such a solution.
> >>>>>
> >>>>> -- Uwe
> >>>>>
> >>>>>> Am 07.02.2024 um 22:15 schrieb Michael Moser <moser...@gmail.com>:
> >>>>>>
> >>>>>> Hi Dan,
> >>>>>>
> >>>>>> This has been discussed in the past, as you found with those two
> >> Jira
> >>>>>> tickets.  Personally, I'm still not sure whether a new failure
> >>>>> relationship
> >>>>>> on UpdateAttribute in 2.0 is a good approach.  I have heard from
> >> some
> >>>>>> dataflow managers that would not want to go through their entire
> >>> graph
> >>>>> when
> >>>>>> upgrading to 2.0 and update every UpdateAttribute configuration.
> >>>>>>
> >>>>>> I have heard some alternatives to a 'failure' relationship that I
> >>> would
> >>>>>> like to share as options.
> >>>>>>
> >>>>>> 1) Add a new property to UpdateAttribute that controls whether a
> >>>> flowfile
> >>>>>> that causes an expression language exception either yields and
> >> rolls
> >>>>> back,
> >>>>>> or silently fails to update the attribute and sends the flowfile to
> >>>>>> success.  I personally don't like this, because the use case for
> >>>> "silent
> >>>>>> failure" seems really like a rarely needed edge case.
> >>>>>>
> >>>>>> 2) Identify all expression language methods that can throw an
> >>> exception
> >>>>> and
> >>>>>> document that fact in the Expression Language Guide (some methods
> >>>> already
> >>>>>> mention they can throw an "exception bulletin").  Then implement
> >> new
> >>>>>> expression methods to check if an expression could fail, and use
> >> that
> >>>> in
> >>>>>> UpdateAttribute advanced rules.  For example, if the format() and
> >>>>>> formatInstant() methods can fail on a negative number, we create a
> >>> new
> >>>>>> method such as isValidMilliseconds().  This already exists for some
> >>>>> cases,
> >>>>>> such as isJson() which can do a quick check of some value before
> >>>> calling
> >>>>>> jsonPathDelete() on it.
> >>>>>>
> >>>>>> I'm curious to hear more thoughts on this.
> >>>>>>
> >>>>>> -- Mike
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>> On Wed, Jan 31, 2024 at 11:02 AM Dan S <dsti...@gmail.com> wrote:
> >>>>>>>
> >>>>>>> My team is requesting a failure relationship for UpdateAttribute
> >> as
> >>>>> seen in
> >>>>>>> NIFI-5448 <https://issues.apache.org/jira/browse/NIFI-5448> and
> >>>>> NIFI-6344
> >>>>>>> <https://issues.apache.org/jira/browse/NIFI-6344> as we are
> >>>>>>> experiencing the same problem where a NIFI Expression Language is
> >>>>> throwing
> >>>>>>> an exception. In the PR for NIFI-5448 it was mentioned this
> >> feature
> >>>>> would
> >>>>>>> have to wait until NIFI 2.0.0. I wanted to know if there is any
> >>> active
> >>>>> work
> >>>>>>> regarding this and whether eventually there will be a failure
> >>>>> relationship
> >>>>>>> added to UpdateAttribute?
> >>>>>>>
> >>>>>
> >>>>>
> >>>>
> >>>
> >>
>

Reply via email to