Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

Cover image for As Simple as Possible, But Not Simpler
Leon Adato
Leon Adato

Posted on • Originally published atadatosystems.com

     

As Simple as Possible, But Not Simpler

n building the demos for my "absolutely simple" series, I've worked hard to stick to the spirit of one of Albert Einstein's famous quotes:

"If you can't explain it simply, you don't understand it well enough." - Albert Einstein

The idea was that I would strip my examples down to the barest essentials - not a single line of code more than what was needed. No additional elements, files, containers or whatnot.

Of course, the intent isn't to stop at that (admittedly simplistic) level, but to use it as a foundation to establish a basic understanding of the tool, technique, or feature; and then build to more real-world scenarios from there.

As I worked on the next entry in my "absolutely simple" series, I tried to build a demo for application performance tracing (or APM). In most of my previous efforts, I always had a sense that - given enough time - I could probably have made my example simpler still. More stripped-down. More "atomic", if you will.

However, in my quest to create the simplest possible example of APM, I ran into the essence of a different Einstein quote:

"Everything Should Be Made as Simple as Possible, But Not Simpler" - Albert Einstein (paraphrased)

I build a demo of an app that was just 10 lines, but refused to show up New Relic's APM screen.

import newrelic.agentnewrelic.agent.initialize('newrelic.ini')from passeo import passeo@newrelic.agent.background_task(name="NameyMcNameyFace", group='GroupyMcGroupFace')def execute_task():    print(passeo().generate(length=10, numbers=True, symbols=True, uppercase=True, lowercase=False, space=True, save=True))execute_task()newrelic.agent.shutdown_agent(timeout=10)
Enter fullscreen modeExit fullscreen mode

For context, this script leverages the open sourcePasseo library, which generates passwords and/or checks existing passwords to ensure the pass a basic strength check. The problem (from an APM perspective) is that my script was designed as a "run and done" type utility rather than a persistent application. Perfect for the busy sysadmin (my kind of people), but very bad if you want to trace the performance of an application over time. Because effectively, thereIS no time.

Once a friend helped frame the root cause, I found a way to bulk it up a bit:

import newrelic.agentnewrelic.agent.initialize('newrelic.ini') #This is required!from passeo import passeoimport requestsimport jsonimport timeinputurl = "https://random-word-api.herokuapp.com/word"@newrelic.agent.background_task(name="NameyMcNameyFace", group='GroupyMcGroupFace')def execute_task():    getword = requests.get(inputurl).json() # Call the api to retrieve the statistics    print("Password is "+getword[0])    print(passeo().strengthcheck(getword[0]))counter = 0while True:    execute_task()    time.sleep(5)newrelic.agent.shutdown_agent(timeout=100)
Enter fullscreen modeExit fullscreen mode

The modified code does three things missing from the original version:

  • First, by adding some pauses and delays, each operation takes a little longer, giving the APM agent time to sink it's teeth into everything going on.
  • Having the code make a call to an external API (to grab a random word out of the dictionary) also adds to the overall execution time.
  • And finally, I had to add a special delay to the New Relic APM agent, so it didn't clean itself up too quickly and miss some of the trace data.

With those changes in place, my application tracing now shows up.

This isn't the actual "absolutly simple APM" blog, so my goal isn't to describe how APM works, or the other steps I took to get this instrumented.

Instead, I wanted to talk this experience, when I discovered the limits of simplicity, and had to embrace just a bit more complexity to get where I needed to go.

Top comments(0)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

I've worked as an actor, exterminator, electrician, carpenter, stage-combat instructor, American Sign Language interpreter, and Sunday school teacher. Oh, and I work with computers, too.
  • Location
    Cleveland, Ohio
  • Education
    New York Univeristy
  • Pronouns
    he/him
  • Work
    Principal Technical Evangelist at Kentik
  • Joined

Trending onDEV CommunityHot

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp