Commit Graph

88 Commits

Author SHA1 Message Date
Pawel Chojnacki 765ddaeb85 Only enable unicorn metrics when not in sidekiq mode.
+ remove rebased test case
2017-11-02 21:27:28 +01:00
Pawel Chojnacki c9f0070b64 Make subscriber tests pass, after refactoring metrics 2017-11-02 18:18:16 +01:00
Pawel Chojnacki 735365a367 rename BackgroundMigration to SidekiqMigration 2017-11-02 18:18:16 +01:00
Pawel Chojnacki 30a4bb6628 Fix sidekiq middleware tests 2017-11-02 18:16:58 +01:00
Pawel Chojnacki 534f6b1125 Tests for Web transaction and remove simple transacton 2017-11-02 18:11:44 +01:00
Pawel Chojnacki 19634c259d Cleanup metrics names and removing unnecessary cache read total 2017-11-02 18:11:44 +01:00
Pawel Chojnacki c361c1e857 Adjust test to changed metrics methods.
+ remove deprecated test suite
2017-11-02 18:11:44 +01:00
Pawel Chojnacki f64085e693 Move labels tests from Metrics rack spec to Transaction spec 2017-11-02 18:11:44 +01:00
Pawel Chojnacki 9360f37aae Fix Rubocop warnings 2017-11-02 18:11:44 +01:00
Pawel Chojnacki b90bf88b14 Fix rspec errors, and add more tests to MethodCall and ActionView 2017-11-02 18:11:43 +01:00
Pawel Chojnacki 6b53dd28c7 Cache spec check if prometheus metrics are triggered 2017-11-02 18:11:43 +01:00
Pawel Chojnacki 8dbb228be9 Rails cache spec 2017-11-02 18:11:43 +01:00
Pawel Chojnacki 39ac6acbcc Fix Active record and transaction specs 2017-11-02 18:11:43 +01:00
Pawel Chojnacki 38fbd25bbf Ruby sampler spec 2017-11-02 18:11:43 +01:00
Pawel Chojnacki c97dc61a9e Cleanup transaction metrics 2017-11-02 18:11:43 +01:00
Pawel Chojnacki f464adaaf6 Remove transaction tags and map transaction metrics to prometheus
+ clean transaction metrics

+ Gemfile.lock file update
2017-11-02 18:10:57 +01:00
Pawel Chojnacki 03b38a4a8d Add GC sampler and small refactor of samplers 2017-11-02 18:09:21 +01:00
micael.bergeron 2b7e03cf69 reword `targets` to `metric tags`
add changelog
2017-10-31 13:21:08 -04:00
micael.bergeron 7799a9bc44 add metrics tagging to the sidekiq middleware 2017-10-31 09:48:10 -04:00
Rémy Coutable 1b413bd62f Enable Timecop safe mode
Signed-off-by: Rémy Coutable <remy@rymai.me>
2017-08-11 14:53:17 +02:00
Paweł Chojnacki 746f0ec367 Add sidekiq metrics endpoint and add http server to sidekiq 2017-08-07 17:13:02 +00:00
Pawel Chojnacki 2d0741e562 Rename ConnectionRackMiddleware to RequestsRackMiddleware.
+ fix tests after metrics rename
2017-07-13 00:46:17 +02:00
Ben Kochie e9363229b7 Update rack metric names
* Follow Prometheus naming conventions[0].
* Simplify metrics by adding response lables to the histogram.
* Use standard `http_request_duration_seconds_...` names for the histogram.

[0]: https://prometheus.io/docs/practices/naming/#metric-names
2017-07-12 14:37:08 +02:00
Paweł Chojnacki 26ac691a68 Instrument Unicorn with Ruby exporter 2017-07-04 15:28:34 +00:00
Grzegorz Bizon 0430b76441 Enable Style/DotPosition Rubocop 👮 2017-06-21 13:48:12 +00:00
Douwe Maan 1fe7501b49 Revert "Prefer leading style for Style/DotPosition"
This reverts commit cb10b725c8929b8b4460f89c9d96c773af39ba6b.
2017-02-23 09:33:05 -06:00
Douwe Maan 6023fbfd0f Enable Style/EmptyLineBetweenDefs 2017-02-23 09:32:22 -06:00
Douwe Maan 206953a430 Prefer leading style for Style/DotPosition 2017-02-23 09:32:22 -06:00
Douwe Maan f72a65603d Fix another spec 2017-02-23 09:31:57 -06:00
Douwe Maan 02494f7ce8 Fix specs 2017-02-23 09:31:57 -06:00
Douwe Maan 3a8128f199 Enable Lint/UnifiedInteger 2017-02-23 09:31:57 -06:00
Rémy Coutable 892ff3a3ae
Check for env[Grape::Env::GRAPE_ROUTING_ARGS] instead of endpoint.route
`endpoint.route` is calling `env[Grape::Env::GRAPE_ROUTING_ARGS][:route_info]`
but `env[Grape::Env::GRAPE_ROUTING_ARGS]` is `nil` in the case of a 405 response

Signed-off-by: Rémy Coutable <remy@rymai.me>
2017-01-12 23:15:25 -05:00
Rémy Coutable 90c6a1a319 Use Grape's new Route methods
- Use Route#request_method instead of Route#route_method
- Use Route#path instead of Route#route_path

Signed-off-by: Rémy Coutable <remy@rymai.me>
2016-12-21 13:46:52 +01:00
Paco Guzman a5079f68e6 Adds response mime type to transaction metric action when it's not HTML 2016-08-25 16:33:41 +02:00
Yorick Peterse d345591fc8
Tracking of custom events
GitLab Performance Monitoring is now able to track custom events not
directly related to application performance. These events include the
number of tags pushed, repositories created, builds registered, etc.

The use of these events is to get a better overview of how a GitLab
instance is used and how that may affect performance. For example, a
large number of Git pushes may have a negative impact on the underlying
storage engine.

Events are stored in the "events" measurement and are not prefixed with
"rails_" or "sidekiq_", this makes it easier to query events with the
same name triggered from different parts of the application. All events
being stored in the same measurement also makes it easier to downsample
data.

Currently the following events are tracked:

* Creating repositories
* Removing repositories
* Changing the default branch of a repository
* Pushing a new tag
* Removing an existing tag
* Pushing a commit (along with the branch being pushed to)
* Pushing a new branch
* Removing an existing branch
* Importing a repository (along with the URL we're importing)
* Forking a repository (along with the source/target path)
* CI builds registered (and when no build could be found)
* CI builds being updated
* Rails and Sidekiq exceptions

Fixes gitlab-org/gitlab-ce#13720
2016-08-17 10:04:04 +02:00
Yorick Peterse 905f8d763a
Reduce instrumentation overhead
This reduces the overhead of the method instrumentation code primarily
by reducing the number of method calls. There are also some other small
optimisations such as not casting timing values to Floats (there's no
particular need for this), using Symbols for method call metric names,
and reducing the number of Hash lookups for instrumented methods.

The exact impact depends on the code being executed. For example, for a
method that's only called once the difference won't be very noticeable.
However, for methods that are called many times the difference can be
more significant.

For example, the loading time of a large commit
(nrclark/dummy_project@81ebdea5df)
was reduced from around 19 seconds to around 15 seconds using these
changes.
2016-07-28 16:56:17 +02:00
Paco Guzman 330de255b7 RailsCache metrics now includes fetch_hit/fetch_miss and read_hit/read_miss info. 2016-07-05 12:28:06 +02:00
Yorick Peterse d7b4f36a3c
Use clock_gettime for all performance timestamps
Process.clock_gettime allows getting the real time in nanoseconds as
well as allowing one to get a monotonic timestamp. This offers greater
accuracy without the overhead of having to allocate a Time instance. In
general using Time.now/Time.new is about 2x slower than using
Process.clock_gettime(). For example:

    require 'benchmark/ips'

    Benchmark.ips do |bench|
      bench.report 'Time.now' do
        Time.now.to_f
      end

      bench.report 'clock_gettime' do
        Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond)
      end

      bench.compare!
    end

Running this benchmark gives:

    Calculating -------------------------------------
                Time.now   108.052k i/100ms
           clock_gettime   125.984k i/100ms
    -------------------------------------------------
                Time.now      2.343M (± 7.1%) i/s -     11.670M
           clock_gettime      4.979M (± 0.8%) i/s -     24.945M

    Comparison:
           clock_gettime:  4979393.8 i/s
                Time.now:  2342986.8 i/s - 2.13x slower

Another benefit of using Process.clock_gettime() is that we can simplify
the code a bit since it can give timestamps in nanoseconds out of the
box.
2016-06-28 17:51:25 +02:00
Paco Guzman 9101915cb7 Add Sidekiq queue duration to transaction metrics. 2016-06-23 13:09:52 +02:00
Yorick Peterse be3b878443 Track method call times/counts as a single metric
Previously we'd create a separate Metric instance for every method call
that would exceed the method call threshold. This is problematic because
it doesn't provide us with information to accurately get the _total_
execution time of a particular method. For example, if the method
"Foo#bar" was called 4 times with a runtime of ~10 milliseconds we'd end
up with 4 different Metric instances. If we were to then get the
average/95th percentile/etc of the timings this would be roughly 10
milliseconds. However, the _actual_ total time spent in this method
would be around 40 milliseconds.

To solve this problem we now create a single Metric instance per method.
This Metric instance contains the _total_ real/CPU time and the call
count for every instrumented method.
2016-06-17 13:09:55 -04:00
Paco Guzman 2e552c6bf0 Filter out sensitive parameters of metrics data 2016-06-17 18:14:25 +02:00
Yorick Peterse ab91f1226f
Filter out classes without names in the sampler
We can't do a lot with classes without names as we can't filter by them,
have no idea where they come from, etc. As such it's best to just ignore
these.
2016-06-14 18:09:06 +02:00
Yorick Peterse 0ca7b3ba37 Merge branch '18449-instrument-grape-endpoints' into 'master'
Instrument Grape API endpoints

See merge request !4587
2016-06-14 14:29:55 +00:00
Paco Guzman dadc531353 Instrument private/protected methods
By default instrumentation will instrument public,
protected and private methods, because usually
heavy work is done on private method or at least
that’s what facts is showing
2016-06-14 15:17:51 +02:00
Paco Guzman 509082bafb Instrument Grape Endpoint with Metrics::RackMiddleware
Generating the following tags

Grape#GET /projects/:id/archive

from Grape::Route objects like

{ :path => /:version/projects/:id/archive(.:format)
  :version => “v3”,
  :method => “GET” }

Use an instance variable to cache raw_path transformations.
This variable is only going to growth to the number of 
endpoints of the API, not with exact different requests

We can store this cache as an instance variable because 
middleware are initialised only once
2016-06-14 13:06:46 +02:00
Paco Guzman 120fbbd487 Measure CPU time for instrumented methods 2016-06-14 12:49:31 +02:00
Robert Speicher 75739e54be Enable RSpec/NotToNot cop and auto-correct offenses
Also removes the note from the development/testing.md guide
2016-05-24 15:40:29 -04:00
Pablo Carranza b9306c2e82 Add cache count metrics to rails cache 2016-05-15 19:47:41 +01:00
Yorick Peterse 945c5b3fe6
Removed tracking of total method execution times
Because method call timings are inclusive (that is, they include the
time of any sub method calls) this would lead to the total method
execution time often being far greater than the total transaction time.
Because this is incredibly confusing it's best to simply _not_ track the
total method execution time, after all it's not that useful to begin
with.

Fixes gitlab-org/gitlab-ce#17239
2016-05-12 15:15:45 +02:00
Yorick Peterse 7e6f0ac0e0
Count the number of SQL queries per transaction
Fixes gitlab-org/gitlab-ce#15335
2016-04-18 14:53:13 +02:00