Late to the party because I was heads-down on Pipeline bugs a lot of 
Friday, but this is a subject near-and-dear to my heart and in the past 
I've discussed what metrics might be interesting since this was an explicit 
intent to surface from my Bismuth (Pipeline Graph Analysis APIs).  Some of 
these are things I'd wanted to make a weekend project of (including 
surfacing the existing workflow-cps performance metrics). 

We should aim to implement Metrics using the existing Metrics interface 
because then that can be fairly easy exported in a variety of ways -- I use 
a Graphite Metrics reporter that couples to another metric aggregator/store 
for the Pipeline Scalability Lab (some may know it as "Hydra").  Other 
*cough* proprietary systems may already consume this format of data.  I 
would not be surprised if a StatsD reporter is pretty easy to hack together 
using https://github.com/ReadyTalk/metrics-statsd and you get a lot of 
goodies "for free."

The one catch for implementing metrics is that we want to be cautious about 
adding too much overhead to the execution process. 

As far as specific metrics:

> distinct built-in step invocations (i.e. not counting Global Variable 
invocations)

This can't be measured easily from the flow graph due to the potential to 
create multiple block structures for one step.  It COULD be added easily 
via a registered new StepListener API in workflow-api (and implemented in 
workflow-cps) though.   I think it's valuable.

> configured Declarative Pipelines, configured Script Pipelines 

We can get all Pipelines (flavor-agnostic) by iterating over WorkflowJob 
items.  Not sure how we'd tell Scripted vs. Declarative -- maybe 
registering a Listener extension point of some sort?   I see value here. 

I'd *also* like to have a breakdown of which Pipelines have been run in the 
last, say week and month, by type (easy to do by looking at the most recent 
build).   That way we know not just which were created but which are in 
active use. 

> Pipeline executions

Rates and counts can be achieved with the existing Metrics Timer time.  I'd 
like to see that broken down by Scripted vs. Declarative as well. 

> * Global Shared Pipelines configured 
>   * Folder-level Shared Pipelines configured 

Do you mean Shared Library use?  One metric I'd be interested in is how 
many shared libraries are used *per-pipeline* -- easy to measure from the 
count of LoadedScripts I believe (correct me if there's something I'm 
missing here, Jesse). 

> Agents used per-Pipeline

I think should be possible to do this easily via flow graph analysis, 
looking for WorkspaceActionImpl -- nodes and labels are be available.  We 
might want to count total nodes *uses* (open/close of node blocks) and 
distinct nodes used.  

Best to triggers as a post-build analysis using the RunTrigger -- that way 
it's just a quick iteration over the Pipeline. 

> Runtime duration per step invocation

This is one of the MOST useful metrics I think.

I already have an implementation used in the Scalability Lab that does this 
on a per-flownode basis using the GraphListener (rather than per-step).  
This is part of a small utility plugin for metrics used in the scalability 
lab (not hosted currently since it's not general-use). 

Doing per-step is somewhat more complex - for many steps, trivial, but for 
example for a Retry step there's not a logical way to do it because you get 
multiple blocks.  Blocks in general are undefined - do you count the block 
*contents*, just the start, just the end, or start+end nodes?   Also 
remember that Groovy logic counts against the Step time with the 
FlowNodes.  Usually that shouldn't be a huge issue unless the Groovy is 
complex.  

If that's too noisy there might be ways to insert Listeners for the Step 
itself (more complex though) -- I think using the FlowNodes is good enough 
for now and gives us a solid first-order approximation that is useful 99% 
of the time. 

I would also like to extend this by breaking it down into separate metrics 
per step type, i.e. runtime for sh, runtime for echo, for 'node', etc.  
 This is easier than you'd think since you can fetch the StepDescriptor and 
call getFunctionName to get a unique metric key for the step.   This is far 
more useful to us than just average step timings, because it helps spot 
performance regressions in the field. 

Other aggregates of interest: total time spent in each step type for the 
pipeline and counts of the FlowNode by step per pipeline.  This will show 
if we're spending (for example) a LOT of time running 
readFile/writeFile/dir steps due to some sudden bottleneck in the remoting 
interaction and also reveal which step types are used most often.   Knowing 
which steps are used heavily helps me know which deserve extra priority for 
bugfixes, features, and optimizations.

It actually *sounds* far more complicated than it really is -- this would 
be a pretty trivial afternoon project I think. 

> Runtime duration per Pipeline

I already have an implementation.  Same plugin as above.  It's exposed as a 
DropWizard histogram as well, so you get rates + aggregate times with 
median, mean, etc. 

*Other desired metrics:  *I think we want FlowNodes created as a rate per 
unit time (I have an implementation in the same plugin above).   I also 
have an impl for this already (same plugins as before). 

If we could find a way I'd really like to have a counter of how many 
elements of GroovyCPS logic are run and how many function calls (for 
off-master you obviously wouldn't get this data).  This is something useful 
for measuring the real complexity of their Groovy -- even better than 
Liam's Cyclomatic Complexity metric because it directly tracks runtime 
operations, not just code structure.   I have notions how we'd accomplish 
this.

On Friday, March 16, 2018 at 6:55:58 PM UTC-4, Andrew Bayer wrote:
>
> It’s a normal step - what I’m talking about is counting Pipelines 
> containing one or more script blocks, I.e., what percentage of total 
> Declarative Pipelines use script blocks, which I think is a more useful 
> metric than just how many script block invocations there are.
>
> A.
>
> On Fri, Mar 16, 2018 at 5:32 PM R. Tyler Croy <ty...@monkeypox.org 
> <javascript:>> wrote:
>
>> (replies inline)
>>
>> On Fri, 16 Mar 2018, Andrew Bayer wrote:
>>
>> > If we???re going to be tracking step invocations anyway, it???d be 
>> interesting
>> > to count the number of Declarative Pipelines with a script block, maybe?
>>
>> I kind of assumed that if we were incrementing a counter on step 
>> invocations
>> that script{} would be collected already by the machinery, e.g. isn't it 
>> "just"
>> a step?
>>
>> If it's a special snowflake then I'll make sure to include it in my 
>> design.
>>
>>
>> A few more which come to mind now that I'm thinking about Script:
>>
>>  * Count of stages per Pipeline
>>  * Count of Pipelines with the Groovy sandbox disable
>>  * Time spent in script{} block
>>
>>
>> Thanks for the ideas abayer!
>>
>>
>> Cheers
>> - R. Tyler Croy
>>
>> ------------------------------------------------------
>>      Code: <https://github.com/rtyler>
>>   Chatter: <https://twitter.com/agentdero>
>>      xmpp: rty...@jabber.org <javascript:>
>>
>>   % gpg --keyserver keys.gnupg.net --recv-key 1426C7DC3F51E16F
>> ------------------------------------------------------
>>
>> --
>> You received this message because you are subscribed to the Google Groups 
>> "Jenkins Developers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to jenkinsci-de...@googlegroups.com <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/jenkinsci-dev/20180316213201.ckenekkqcbgtsuzx%40blackberry.coupleofllamas.com
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to jenkinsci-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-dev/9842785f-49ee-43fc-ab61-d9e7b45dc3db%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to