Introducing Search

Today we are excited to unveil our most powerful feature yet: Search. Sort and find invocations that match powerful expressions ⚡️ fast.

Searching through millions of function invocations for those that took longer than 500ms

At IOpipe, we approach features on multiple fronts, based on current and potential future use cases. We enjoy employing an iterative approach with feature flags using LaunchDarkly to create mini beta programs for design we want feedback on. We use a plugin architecture in the spirit of eslint, babel, and webpack in client agents that allows us to evaluate proposals in a modular approach — our most recent success story being the Event Info Plugin. Most importantly, we aim for a user-centric workflow rooted in user stories. If we can’t adequately craft a user story for a feature, we know that the process of building it can: bust time budgets, obscure complexity, and worst — return little yield with no user interested in it.

We’ve been jamming on Search for a decent amount of time. We crafted many user stories, worked through several major iterations, and gathered crucial user feedback. As it turns out, searching for things is a complicated process. You simultaneously need to ensure an experience is easy enough to get started, yet sophisticated enough for power users.

What are we looking for?

The core data unit in IOpipe is a function invocation. An event hits your lambda, your function executes as normal, data is captured directly with our telemetry service. From this invocation and groups of others, we build a beautiful, exploratory dashboard experience with observability at the core.

Current production IOpipe dashboard

So far, we’ve been successful in serving a multitude of use cases for debugging, monitoring, and exploring serverless architectures with the current feature set. We are big on linkability, wayfinding, and maintaining relevant context for each view. When you don’t exactly know what you’re looking for, we believe you’re in good hands when paired with the IOpipe dashboard.

But what if you do know exactly what you want to see? Or you want to see groups of invocations that aren’t immediately apparent in exploratory mode?

It’s all about the data, yo

Let’s take a look at real invocation page (with some sensitive info marked out). This function is part of the IOpipe alerting service mesh. It grabs some data in question from our GraphQL service, runs through various logic gates and decides whether the alert in question has transitioned (from one alert state to another), and whether it should trigger a notification to the defined hooks (email, slack, pagerduty, webhook, and yes — lambda).

A function invocation page, with base metrics, tracing, and custom metrics shown

For this invocation, you can see that we have some base info like the function ARN, region, and Request ID. We’ve also taken advantage of IOpipe tracing and custom metrics to give us extra visibility directly related to this particular service. So maybe, just maybe, we insert something into the database when new-status is true and would like to see all of the invocations over the past few days where this happened. Let’s try it:

Well that was easy 😎. And nice! We searched through exactly 1,660,064 invocations over 3 days to hone in on the group we were looking for. 🙇‍

As you may be able to pick out, we’ve got some handy quick links below the textual input that can create search expressions even faster. It also reflects the list of current search vectors we are announcing today:

Search for invocations by:

Cold Start

IOpipe Custom metrics (string + number)

Duration

Errors present

Function

Region

AWS Request ID

IOpipe Trace Measurements

You use a terse, pragmatic expression syntax that hopefully feels familiar and easy to grok. An expression helper will be available right on the search page.

We’ve got a list of search vectors in mind to add in the coming weeks, and as always, we’ll work to prioritize the ones we receive feedback about. ✋

Examples

Here are some examples to kickstart your cosmic serverless brain:

Find invocations across two regions with the same trace measurements to determine latency for your users

Looking for a specific Request ID? If there’s more than 1 invocation that shows up in search — you were probably in a retry situation

Do you have too many invocations from a shady offshore IP? Ban em!

Are you doing database operations at times you don’t expect? Let’s dig into that.

Just a few samples, and no doubt there will be many use cases we haven’t even thought of yet.

Check it out

We’ve heard frequently from people using IOpipe that it’s quite handy to be presented with birds-eye data, ensuring quality of service at the function, app, or project level. Aggregated metrics and charts highlighting spikes are great for the “Situation Report”. But where do you go from there? After you’ve been alerted in Slack (thanks!) that your function duration broke 500ms, how do you determine root cause?

We believe search fills this gap nicely, surfacing invocations that you care about at the time. We are confident you’re going to love the power, speed, and ease of this feature and hope to hear your thoughts.

Try it out here!

If you’re using AWS Lambda Functions and want to try out IOpipe, we’ve got a 2-week full-access trial and a forever-free tier. Give it a shot!

Bonus! A GIF of Alia Shawkat from Search Party 🔍👀