Throttle Bot or Other Loop/Delay Mechanism?

I have a process where I am submitting a data load to an engine that reviews the data. I want to accomplish a couple things.

First - I want to be able to have the Pipeline pause for a delay I specify.

Second - I want the Pipeline to then “loop” and peridically check back using a DB lookup (Postgres Execute should work) to check the status of the submitted data…and do some kind of loop until it finds the status it wants, a timeout would be handy too in case it never finds the proper “complete” status.

Once it does find the right status it is looking for it would then continue past the loop condition and fire off post-processing steps in the database to clean data up, extract results of the submitted batch, etc.

I have seen a Snap referred to in the documentation as a “Throttle Bot Snap” in some examples (for instance this one https://docs-snaplogic.atlassian.net/wiki/spaces/SD/pages/2067890766/Use+Case+Employee+Onboarding), but I cannot actually find the snap itself or the Snap Pack it must come in. If anyone can help me with the above technical issue or tell me how to find the Throttle Bot Snap that woould be very appreciated.

Thank You,

Brent Van Allen
Aduro.

Hi @brent.vanallen,

Regardless delaying, you can accomplish that with Script snap.
Here I use python

  • At the top first import time module
  • Use time.sleep(sec) method
from com.snaplogic.scripting.language import ScriptHook
import time 

class TransformScript(ScriptHook):
    def __init__(self, input, output, error, log):
        self.input = input
        self.output = output
        self.error = error
        self.log = log

    def execute(self):
        self.log.info("Executing Transform script")

        ## Move time.sleep() here out of while loop if you want to wait only by the seconds you have specified not more.

        while self.input.hasNext():
            try:
                inDoc = self.input.next()

                ## Here will wait for each document. That means if we have 5 documents at input and sleep is set for 10 seconds, it will wait 50 seconds till returns the output.
                ## In parameter specify the time in seconds. You can make it time dynamic if you specify the time out of the script snap and after that by getting the value with inDoc.get("field_Name")
                time.sleep(10) 

                self.output.write(inDoc, inDoc)
            except Exception as e:
                errDoc = {
                    'error' : str(e)
                }
                self.log.error("Error in python script")
                self.error.write(errDoc)

        self.log.info("Script executed")

    def cleanup(self):
        self.log.info("Cleaning up")

hook = TransformScript(input, output, error, log)

Regards,
Viktor

@brent.vanallen

Regarding the delaying, the Python script provided by @viktor_n can be used. I am not aware of the Throttle Bot Snap as well.

Regarding the loop mechanism. Maybe is better to avoid any kind of loops and try with a process that will be scheduled(using scheduled task) to run on some predestined time interval and will do the DB lookup. If there is no desired status found then simply complete the execution, and if there is a status found then execute the post-processing steps.

Regards,
Spiro Taleski

@Spiro_Taleski, I can see this has been a feature request for 4 years based on the link you gave…also looks like I am not alone at all in this request. I am surprised that Snaplogic can’t just create a simple Snap to accomplish this given the desire in the community to have it.

Hi @brent.vanallen

Throttle Bot is a snap in a “test” snap pack that we use internally. It probably shouldn’t have been referenced in our documentation.

We do have an Snap SDK which allow customers to create their own custom snaps. Now, I’m not necessarily suggesting this for this case, and get it, that this should probably be an available snap.

Thank you @Spiro_Taleski and @viktor_n for all of your contributions to community. I’ve actually learned quite a bit from your answers.

I’ll ask the Snap team regarding whether we would consider making one or more of these “test” snaps available. These snaps are sufficient for our usage, but may need a bit of work before being released to a wider audience which is probably why they haven’t.

Thanks for the insight on the Snap. I used Viktor’s Ruby delay, but have been unable to get a loop working in order to (A) Submit a load to my MDM tool and (B) check back on DB status of the load to perform the next steps in the process. Setting this process up, Snaplogic looks like it avoids “entering” the loop…sticking on the step right before the loop starts.

I posted a diagram here, you can see the last Snap it will execute in green…once it gets here it just sits and spins. This shows that section of the pipeline where (A) we check back of data submitted upstream has finished processing, (B) we check back on that value and if not found to be “DONE” yet we push the document stream back onto itself with a UNION (C).

I’ve done something like this before. I think you’re going to need a multi-pipeline design - I don’t believe there is a way to loop within a single pipeline. The below is just one high-level design idea - there are other options.

The step1 pipeline will do the initial work, then call step2 pipeline (using Pipeline Execute) which will have the delay and check status. The step2 pipeline can have a loopback-or-continue Router snap following the status check where if the status is complete, it forks to the logic to finish the process; but if status is not complete, then it recalls step1 pipeline with Pipeline Execute. You can use parameters and Router snap in the step1 pipeline to determine whether step1 skips the initial processing and simply recalls step2 again. Parameters can also be used as a counter mechanism, so that if the counter exceeds x-number retries, then step2 fails or notifies as desired.

The Pipeline Execute documentation states that it doesn’t support redundancy (even though it works in some of my attempts), otherwise, I would recommend a design within a single pipeline. But I stick with the documentation for pipeline longevity.

No luck with that approach :). Will have to just keep at it.

So did you come up with a decent solution?

BTW, any explanation for why SnapLogic doesn’t support a simple loop flow?

I was never able to get looping to work. Even with the “callback” part of the loop separated out to a separate pipeline and using Pipeline Execute, it appears that Snaplogic can look ahead and detect if the logic in the datastream will create a potential loop…and refuses to enter the loop from the entry point (that would be looped back TO). I was able to get delay working via the suggested approach with a little Ruby script though.

We have not set it up yet but I anticipate that we will end up closing the loop logically by using a REST interface.

I’ve given my boss, who is our SnapLogic admin, information needed for an enhancement request. I am new to SnapLogic, so I hesitate to critique. I’d just say that every other ETL tool and every other usable scripting or coding language I’ve used implements loops. So it’s a shocker that SL doesn’t have this - or that you have to use nested pipelines. So I wholeheartedly encourage them to look into this.

It’s very useful to have a visual that implements a loop and shows you, nicely, what the exit condition is and what variables/fields are getting modified as one iterates. It’s possible to use recursion (pipelines). But given that we can’t click through to child pipelines or see easily what’s getting passed to them (setup of paramaters is very clicky, on both the parent and child ends) - given all this, a loop construct is really needed.

It’s also important to improve recursion and make those parameters more visible. Having to click around the parent, and the child, and having to manually ensure that everything matches, is really hard to do. And recursion is difficult for the citizen-integrators that SL targets. It’s a hard concept. If SL wants to make this easy, a simple loop will help - along with visibility improvements, as noted.

2 Likes