On 2023-03-15, Grafana Labs acquired Pyroscope.
As a result, Grafana Labs Phlare has been archived.
All future development will happen in Grafana Pyroscope.
๐ฅ horizontally-scalable, highly-available, multi-tenant continuous profiling aggregation system
Home Page: https://grafana.com/oss/phlare/
License: GNU Affero General Public License v3.0
On 2023-03-15, Grafana Labs acquired Pyroscope.
As a result, Grafana Labs Phlare has been archived.
All future development will happen in Grafana Pyroscope.
This epic is a catch all for the MVP flamegraph features and design doc containing the investigative takes taken prior to deciding what features we want for the MVP.
currently this is only set in the distributor and not useful for deduping back.
The whole flamegraph is currently not embedded into box panel like logs for instance. see below
The box panel should contains the following:
Some of those might be better to be part of the flamegraph plugin directly TBD.
We should add a way to query for top table I suggest for now we do this in computation in the datasource and add it to the frames.
This should produce an array of self/total per symbols including root.
The basic UI should show:
Each point within the timeseries should allow to see a sigle point in time profile as a flamegraph.
Top tables are an important part of profile visualisation, We should definitively add a way to open a persistent drawer to see the top symbols by ordered by top %self or %total.
Related backend work #172
We should to always keep full visibility if possible of the flamegraph by resizing it this way we can select top table symbols and highlight the flamegraph. In the case resizing the flamegraph is not possible if the screen is too small then replacing the visualisation will be done.
Example from Pyroscope
When looking at the framegraph and refreshing the flamegraph ordering may changes this is probably introduce in the querier code when building the flamebearer.
see https://github.com/grafana/fire/blob/main/pkg/querier/querier_test.go#L153
This is a follow up on #19 and to investigate migrating the target API to the connect framework.
Using OTel as much as possible.
The current colouring is focusing on the total of nodes but not the self making it actually upside down as opposed to what is expected.
Expected from pprof
In a node there's always 2 values, the total and the self, the total includes the self + all children (self).
What's interesting in pprof is that they actually do that per function, in the example you can see some self of main.fibhandler
are small but still in red.
I think it's important to get the coloring right since this is what catches the attention to the user.
https://www.brendangregg.com/blog/2017-07-30/coloring-flamegraphs-code-type.html is a really good read before tackling this issue.
We need a tool to automatically check and apply OSS license for the project, it should be accessible via the Makefile.
This would allow to slice the data further, the data should be ordered first by type and by timestamp.
On each commit we should deploy the new version of the plugin to a grafana instance in dev (could be a new one or https://admin-dev-us-central-0.grafana.net/grafana/?orgId=1)
The plugin should be updated and reinstalled.
This probably means we need to a run a fork of grafana for now see grafana/grafana#52057
Allow the user to add label names to group by in the series graph
We need a way to show the user the variation over time for the current query, this allows them to then drill down to the right range they are interested into.
Backend API PR: #160
This should be on top of the flamegraph and if possible reusing the grafana series panel.
Unlike pyroscope I'd like us to try to avoid bar but instead default to lines like for timeseries in the graph panel and then allow to swap with bar,point,....
The panel should provide:
Have a grafana instance with the explore hack
It seems cheap to save into the Profile schema the total value for each profiles.
This would make it simple for building histogram. Specially with parquet we could load that column only when needed.
....
When reading pprof a lot of stacktrace samples contains values of zero and are forcing us to use more resources on the read/write path.
I suggest we remove those in the distributors before pushing to ingesters.
When hovering over a flamegraph node we should present to the user a popup that contains more details about the current node such as:
Example from pyroscope:
The datasource could detect if this is a Fire or Parca datasource in which case it could use a different API to fetch data.
This would allows to send profile in order and so ease the streaming.
Initial implementation of the fire datasource.
The pprof memory profiles is different compare to other profiles as it contains all allocations since the beginning, plus the current in use heap. This means the profiles gets bigger over time and we're currently storing duplicate data.
Instead of storing the whole profile every-time we actually should diff allocations (bytes+count) and store only that. My first reaction was that we should do that in the client and only send the diff. But if the client is restarting or rolling often then it won't be able to send the diff.
So I'm suggesting that:
__name__="memory_diff"
), when the ingester spot that label he won't compute the diff and store directly the diff.I think we can leave the client side for later as we're unsure what we will do in the future.
the helm chart should only deploy fire as a single binary (target=all) with PVC
We could actually just implement the Push service and register it on the ingester side.
This will avoid multiple push definitions and make the proto linter happy
I think we should use a monospace font for the flamegraph. Right now it's Roboto. We could swap it to Roboto Mono ?
Roboto:
Roboto Mono
May be that means decreasing the font-size too ?
With regards to the text I think we should also include % and total of the node in its respective sample type like pyroscope
This would allow to have contiguous data per profile.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.