gitlab-labkit 0.42.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitlab-ci-asdf-versions.yml +1 -1
- data/.pre-commit-config.yaml +1 -1
- data/.tool-versions +1 -1
- data/README.md +1 -1
- data/config/{covered_experiences → user_experience_slis}/schema.json +5 -5
- data/gitlab-labkit.gemspec +2 -2
- data/lib/gitlab-labkit.rb +2 -1
- data/lib/labkit/fields.rb +20 -7
- data/lib/labkit/middleware/rack.rb +3 -3
- data/lib/labkit/middleware/sidekiq/client.rb +1 -1
- data/lib/labkit/middleware/sidekiq/server.rb +1 -1
- data/lib/labkit/middleware/sidekiq/{covered_experience → user_experience_sli}/client.rb +4 -4
- data/lib/labkit/middleware/sidekiq/{covered_experience → user_experience_sli}/server.rb +4 -4
- data/lib/labkit/middleware/sidekiq/user_experience_sli.rb +17 -0
- data/lib/labkit/middleware/sidekiq.rb +2 -1
- data/lib/labkit/rspec/README.md +36 -27
- data/lib/labkit/rspec/matchers/{covered_experience_matchers.rb → user_experience_matchers.rb} +53 -47
- data/lib/labkit/rspec/matchers.rb +1 -1
- data/lib/labkit/{covered_experience → user_experience_sli}/README.md +28 -28
- data/lib/labkit/{covered_experience → user_experience_sli}/current.rb +7 -7
- data/lib/labkit/user_experience_sli/error.rb +9 -0
- data/lib/labkit/{covered_experience → user_experience_sli}/experience.rb +26 -26
- data/lib/labkit/{covered_experience → user_experience_sli}/null.rb +2 -2
- data/lib/labkit/{covered_experience → user_experience_sli}/registry.rb +13 -13
- data/lib/labkit/{covered_experience.rb → user_experience_sli.rb} +16 -11
- metadata +18 -18
- data/lib/labkit/covered_experience/error.rb +0 -9
- data/lib/labkit/middleware/sidekiq/covered_experience.rb +0 -14
- /data/config/{covered_experiences → user_experience_slis}/testing_sample.yml +0 -0
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
#
|
|
1
|
+
# User Experience SLIs
|
|
2
2
|
|
|
3
|
-
This module covers the definition for
|
|
3
|
+
This module covers the definition for User Experience SLIs, as described in the [blueprint](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/user_experience_slis/#user-experience-sli-definition).
|
|
4
4
|
|
|
5
5
|
## Configuration
|
|
6
6
|
|
|
7
7
|
### Logger Configuration
|
|
8
8
|
|
|
9
|
-
By default, `Labkit::
|
|
9
|
+
By default, `Labkit::UserExperienceSli` uses `Labkit::Logging::JsonLogger.new($stdout)` for logging. You can configure a custom logger:
|
|
10
10
|
|
|
11
11
|
```ruby
|
|
12
|
-
Labkit::
|
|
12
|
+
Labkit::UserExperienceSli.configure do |config|
|
|
13
13
|
config.logger = Labkit::Logging::JsonLogger.new($stdout)
|
|
14
14
|
end
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
This configuration affects all
|
|
17
|
+
This configuration affects all User Experience SLI instances and their logging output.
|
|
18
18
|
|
|
19
19
|
### Registry Path Configuration
|
|
20
20
|
|
|
21
|
-
By default,
|
|
21
|
+
By default, user experience SLI definitions are loaded from the `config/user_experience_slis` directory. You can configure a custom registry path:
|
|
22
22
|
|
|
23
23
|
```ruby
|
|
24
|
-
Labkit::
|
|
24
|
+
Labkit::UserExperienceSli.configure do |config|
|
|
25
25
|
config.registry_path = "my/custom/path"
|
|
26
26
|
end
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
This allows you to:
|
|
30
|
-
- Store
|
|
30
|
+
- Store user experience SLI definitions in a different directory structure
|
|
31
31
|
- Use different paths for different environments
|
|
32
32
|
- Organize definitions according to your application's needs
|
|
33
33
|
|
|
34
34
|
**Note:** The registry is automatically reset when the configuration changes, so the new path takes effect immediately.
|
|
35
35
|
|
|
36
|
-
###
|
|
36
|
+
### User Experience Definitions
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
User Experience SLI definitions will be lazy loaded from the default directory (`config/user_experience_slis`).
|
|
39
39
|
|
|
40
|
-
Create a new
|
|
40
|
+
Create a new user experience SLI file in the registry directory, e.g. config/user_experience_slis/merge_request_creation.yaml
|
|
41
41
|
|
|
42
|
-
The basename of the file will be taken as the
|
|
42
|
+
The basename of the file will be taken as the user_experience_id.
|
|
43
43
|
|
|
44
44
|
The schema header is optional, but if you're using VSCode (or any other editor with support), you can get them validated
|
|
45
45
|
instantaneously in the editor via a [JSON schema plugin](https://marketplace.visualstudio.com/items?itemName=remcohaszing.schemastore).
|
|
46
46
|
|
|
47
47
|
```yaml
|
|
48
|
-
# yaml-language-server: $schema=https://gitlab.com/gitlab-org/ruby/gems/labkit-ruby/-/raw/master/config/
|
|
48
|
+
# yaml-language-server: $schema=https://gitlab.com/gitlab-org/ruby/gems/labkit-ruby/-/raw/master/config/user_experience_slis/schema.json
|
|
49
49
|
description: "Creating a new merge request in a project"
|
|
50
50
|
feature_category: "source_code_management"
|
|
51
51
|
urgency: "sync_fast"
|
|
@@ -66,22 +66,22 @@ https://docs.gitlab.com/development/feature_categorization/#feature-categorizati
|
|
|
66
66
|
|
|
67
67
|
## Usage
|
|
68
68
|
|
|
69
|
-
The `Labkit::
|
|
69
|
+
The `Labkit::UserExperienceSli` module provides a simple API for measuring and tracking user experience SLIs in your application.
|
|
70
70
|
|
|
71
71
|
|
|
72
|
-
#### Accessing a
|
|
72
|
+
#### Accessing a User Experience SLI
|
|
73
73
|
|
|
74
74
|
```ruby
|
|
75
|
-
# Get a
|
|
76
|
-
experience = Labkit::
|
|
75
|
+
# Get a user experience SLI by ID
|
|
76
|
+
experience = Labkit::UserExperienceSli.get('merge_request_creation')
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
#### Using with a Block (Recommended)
|
|
80
80
|
|
|
81
|
-
The simplest way to use
|
|
81
|
+
The simplest way to use user experience SLIs is with a block, which automatically handles starting and completing the experience:
|
|
82
82
|
|
|
83
83
|
```ruby
|
|
84
|
-
Labkit::
|
|
84
|
+
Labkit::UserExperienceSli.start('merge_request_creation') do |experience|
|
|
85
85
|
# Your code here
|
|
86
86
|
create_merge_request
|
|
87
87
|
|
|
@@ -100,7 +100,7 @@ end
|
|
|
100
100
|
For more control, you can manually start, checkpoint, and complete experiences:
|
|
101
101
|
|
|
102
102
|
```ruby
|
|
103
|
-
experience = Labkit::
|
|
103
|
+
experience = Labkit::UserExperienceSli.get('merge_request_creation')
|
|
104
104
|
experience.start
|
|
105
105
|
|
|
106
106
|
# Perform some work
|
|
@@ -119,13 +119,13 @@ experience.complete
|
|
|
119
119
|
|
|
120
120
|
#### Resuming Experiences
|
|
121
121
|
|
|
122
|
-
You can resume a
|
|
122
|
+
You can resume a user experience SLI that was previously started and stored in the context. This is useful for distributed operations or when work spans multiple processes.
|
|
123
123
|
|
|
124
|
-
Just like the start method, we can use a block to automatically complete a
|
|
124
|
+
Just like the start method, we can use a block to automatically complete a user experience SLI:
|
|
125
125
|
|
|
126
126
|
```ruby
|
|
127
127
|
# Resume an experience from context (with block)
|
|
128
|
-
Labkit::
|
|
128
|
+
Labkit::UserExperienceSli.resume(:merge_request_creation) do |experience|
|
|
129
129
|
# Continue the work from where it left off
|
|
130
130
|
finalize_merge_request
|
|
131
131
|
|
|
@@ -139,7 +139,7 @@ Or manually:
|
|
|
139
139
|
|
|
140
140
|
```ruby
|
|
141
141
|
# Resume an experience from context (manual control)
|
|
142
|
-
experience = Labkit::
|
|
142
|
+
experience = Labkit::UserExperienceSli.resume(:merge_request_creation)
|
|
143
143
|
|
|
144
144
|
# Continue the work
|
|
145
145
|
finalize_merge_request
|
|
@@ -149,14 +149,14 @@ experience.checkpoint
|
|
|
149
149
|
experience.complete
|
|
150
150
|
```
|
|
151
151
|
|
|
152
|
-
**Note:** The `resume` method loads the start time from the Labkit context. If no
|
|
152
|
+
**Note:** The `resume` method loads the start time from the Labkit context. If no user experience SLI data exists in the context, it behaves the same as calling methods on an unstarted experience and safely ignores the operation.
|
|
153
153
|
|
|
154
154
|
### Error Handling
|
|
155
155
|
|
|
156
156
|
When using the block form, errors are automatically captured:
|
|
157
157
|
|
|
158
158
|
```ruby
|
|
159
|
-
Labkit::
|
|
159
|
+
Labkit::UserExperienceSli.start('merge_request_creation') do |experience|
|
|
160
160
|
# If this raises an exception, it will be captured automatically
|
|
161
161
|
risky_operation
|
|
162
162
|
end
|
|
@@ -165,7 +165,7 @@ end
|
|
|
165
165
|
For manual control, you can mark errors explicitly:
|
|
166
166
|
|
|
167
167
|
```ruby
|
|
168
|
-
experience = Labkit::
|
|
168
|
+
experience = Labkit::UserExperienceSli.get('merge_request_creation')
|
|
169
169
|
experience.start
|
|
170
170
|
|
|
171
171
|
begin
|
|
@@ -180,6 +180,6 @@ end
|
|
|
180
180
|
|
|
181
181
|
### Error Behavior
|
|
182
182
|
|
|
183
|
-
- In `development` and `test` environments, accessing a non-existent
|
|
183
|
+
- In `development` and `test` environments, accessing a non-existent user experience SLI will raise a `NotFoundError`
|
|
184
184
|
- In other environments, a null object is returned that safely ignores all method calls
|
|
185
185
|
- Attempting to checkpoint or complete an unstarted experience will safely ignore the operation
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "active_support"
|
|
4
|
-
require "labkit/
|
|
4
|
+
require "labkit/user_experience_sli/experience"
|
|
5
5
|
|
|
6
6
|
module Labkit
|
|
7
|
-
module
|
|
7
|
+
module UserExperienceSli
|
|
8
8
|
# The `Current` class represents a container for the current set
|
|
9
|
-
# of `Labkit::
|
|
9
|
+
# of `Labkit::UserExperienceSli::Experience` instances started and
|
|
10
10
|
# not yet completed.
|
|
11
11
|
#
|
|
12
12
|
# It uses `ActiveSupport::CurrentAttributes` to provide a thread-safe way to
|
|
13
13
|
# store and access experiences throughout the request and background job lifecycle.
|
|
14
14
|
#
|
|
15
15
|
# Example usage:
|
|
16
|
-
# Labkit::
|
|
17
|
-
# Labkit::
|
|
16
|
+
# Labkit::UserExperienceSli::Current.active_experiences << my_experience
|
|
17
|
+
# Labkit::UserExperienceSli::Current.rehydrate("create_merge_request", "start_time" => "2025-08-22T10:02:15.237Z")
|
|
18
18
|
class Current < ActiveSupport::CurrentAttributes
|
|
19
|
-
AGGREGATION_KEY = '
|
|
19
|
+
AGGREGATION_KEY = 'labkit_user_experiences'
|
|
20
20
|
|
|
21
21
|
attribute :_active_experiences
|
|
22
22
|
|
|
@@ -25,7 +25,7 @@ module Labkit
|
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def rehydrate(experience_id, **data)
|
|
28
|
-
instance = Labkit::
|
|
28
|
+
instance = Labkit::UserExperienceSli.get(experience_id).rehydrate(data)
|
|
29
29
|
active_experiences[instance.id] = instance
|
|
30
30
|
instance
|
|
31
31
|
end
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
require 'active_support/hash_with_indifferent_access'
|
|
4
4
|
require 'forwardable'
|
|
5
5
|
require 'labkit/context'
|
|
6
|
-
require 'labkit/
|
|
7
|
-
require 'labkit/
|
|
6
|
+
require 'labkit/user_experience_sli/current'
|
|
7
|
+
require 'labkit/user_experience_sli/error'
|
|
8
8
|
|
|
9
9
|
module Labkit
|
|
10
|
-
module
|
|
10
|
+
module UserExperienceSli
|
|
11
11
|
URGENCY_THRESHOLDS_IN_SECONDS = {
|
|
12
12
|
sync_fast: 2,
|
|
13
13
|
sync_slow: 5,
|
|
@@ -17,7 +17,7 @@ module Labkit
|
|
|
17
17
|
|
|
18
18
|
RESERVED_KEYWORDS = %w[
|
|
19
19
|
checkpoint
|
|
20
|
-
|
|
20
|
+
user_experience_id
|
|
21
21
|
feature_category
|
|
22
22
|
urgency
|
|
23
23
|
start_time
|
|
@@ -30,7 +30,7 @@ module Labkit
|
|
|
30
30
|
success
|
|
31
31
|
].freeze
|
|
32
32
|
|
|
33
|
-
# The `Experience` class represents a single
|
|
33
|
+
# The `Experience` class represents a single User Experience
|
|
34
34
|
# event to be measured and reported.
|
|
35
35
|
class Experience
|
|
36
36
|
extend Forwardable
|
|
@@ -42,7 +42,7 @@ module Labkit
|
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
def id
|
|
45
|
-
@definition.
|
|
45
|
+
@definition.user_experience_id
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
# Rehydrate an Experience instance from serialized data.
|
|
@@ -57,21 +57,21 @@ module Labkit
|
|
|
57
57
|
self
|
|
58
58
|
end
|
|
59
59
|
|
|
60
|
-
# Start the
|
|
60
|
+
# Start the User Experience.
|
|
61
61
|
#
|
|
62
62
|
# @yield [self] When a block is provided, the experience will be completed automatically.
|
|
63
63
|
# @param extra [Hash] Additional data to include in the log event
|
|
64
64
|
# @return [self]
|
|
65
|
-
# @raise [
|
|
65
|
+
# @raise [UserExperienceError] If the block raises an error.
|
|
66
66
|
#
|
|
67
67
|
# Usage:
|
|
68
68
|
#
|
|
69
|
-
#
|
|
69
|
+
# UserExperience.new(definition).start do |experience|
|
|
70
70
|
# experience.checkpoint
|
|
71
71
|
# experience.checkpoint
|
|
72
72
|
# end
|
|
73
73
|
#
|
|
74
|
-
# experience =
|
|
74
|
+
# experience = UserExperience.new(definition)
|
|
75
75
|
# experience.start
|
|
76
76
|
# experience.checkpoint
|
|
77
77
|
# experience.complete
|
|
@@ -80,14 +80,14 @@ module Labkit
|
|
|
80
80
|
checkpoint_counter.increment(checkpoint: "start", **base_labels)
|
|
81
81
|
log_event("start", **extra)
|
|
82
82
|
|
|
83
|
-
Labkit::
|
|
83
|
+
Labkit::UserExperienceSli::Current.active_experiences[id] = self
|
|
84
84
|
|
|
85
85
|
return self unless block_given?
|
|
86
86
|
|
|
87
87
|
completable(**extra, &)
|
|
88
88
|
end
|
|
89
89
|
|
|
90
|
-
# Checkpoint the
|
|
90
|
+
# Checkpoint the User Experience.
|
|
91
91
|
#
|
|
92
92
|
# @param extra [Hash] Additional data to include in the log event
|
|
93
93
|
# @return [self]
|
|
@@ -101,7 +101,7 @@ module Labkit
|
|
|
101
101
|
self
|
|
102
102
|
end
|
|
103
103
|
|
|
104
|
-
# Resume the
|
|
104
|
+
# Resume the User Experience.
|
|
105
105
|
#
|
|
106
106
|
# @yield [self] When a block is provided, the experience will be completed automatically.
|
|
107
107
|
# @param extra [Hash] Additional data to include in the log
|
|
@@ -115,7 +115,7 @@ module Labkit
|
|
|
115
115
|
completable(**extra, &)
|
|
116
116
|
end
|
|
117
117
|
|
|
118
|
-
# Complete the
|
|
118
|
+
# Complete the User Experience.
|
|
119
119
|
#
|
|
120
120
|
# @param extra [Hash] Additional data to include in the log event
|
|
121
121
|
# @return [self]
|
|
@@ -129,7 +129,7 @@ module Labkit
|
|
|
129
129
|
total_counter.increment(error: has_error?, **base_labels)
|
|
130
130
|
apdex_counter.increment(success: apdex_success?, **base_labels) unless has_error?
|
|
131
131
|
log_event("end", **extra)
|
|
132
|
-
Labkit::
|
|
132
|
+
Labkit::UserExperienceSli::Current.active_experiences.delete(id)
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
self
|
|
@@ -157,13 +157,13 @@ module Labkit
|
|
|
157
157
|
private
|
|
158
158
|
|
|
159
159
|
def base_labels
|
|
160
|
-
@base_labels ||= @definition.to_h.slice(:
|
|
160
|
+
@base_labels ||= @definition.to_h.slice(:user_experience_id, :feature_category, :urgency)
|
|
161
161
|
end
|
|
162
162
|
|
|
163
163
|
def ensure_started!
|
|
164
164
|
return @start_time unless @start_time.nil?
|
|
165
165
|
|
|
166
|
-
warn("
|
|
166
|
+
warn("User Experience #{@definition.user_experience_id} not started")
|
|
167
167
|
false
|
|
168
168
|
end
|
|
169
169
|
|
|
@@ -183,7 +183,7 @@ module Labkit
|
|
|
183
183
|
def ensure_incomplete!
|
|
184
184
|
return true if @end_time.nil?
|
|
185
185
|
|
|
186
|
-
warn("
|
|
186
|
+
warn("User Experience #{@definition.user_experience_id} already completed")
|
|
187
187
|
false
|
|
188
188
|
end
|
|
189
189
|
|
|
@@ -204,22 +204,22 @@ module Labkit
|
|
|
204
204
|
|
|
205
205
|
def checkpoint_counter
|
|
206
206
|
@checkpoint_counter ||= Labkit::Metrics::Client.counter(
|
|
207
|
-
:
|
|
208
|
-
'Total checkpoints for
|
|
207
|
+
:gitlab_user_experience_checkpoint_total,
|
|
208
|
+
'Total checkpoints for user experiences'
|
|
209
209
|
)
|
|
210
210
|
end
|
|
211
211
|
|
|
212
212
|
def total_counter
|
|
213
213
|
@total_counter ||= Labkit::Metrics::Client.counter(
|
|
214
|
-
:
|
|
215
|
-
'Total
|
|
214
|
+
:gitlab_user_experience_total,
|
|
215
|
+
'Total user experience events (success/failure)'
|
|
216
216
|
)
|
|
217
217
|
end
|
|
218
218
|
|
|
219
219
|
def apdex_counter
|
|
220
220
|
@apdex_counter ||= Labkit::Metrics::Client.counter(
|
|
221
|
-
:
|
|
222
|
-
'Total
|
|
221
|
+
:gitlab_user_experience_apdex_total,
|
|
222
|
+
'Total user experience apdex events'
|
|
223
223
|
)
|
|
224
224
|
end
|
|
225
225
|
|
|
@@ -233,7 +233,7 @@ module Labkit
|
|
|
233
233
|
def build_log_data(event_type, **extra)
|
|
234
234
|
log_data = ActiveSupport::HashWithIndifferentAccess.new(
|
|
235
235
|
checkpoint: event_type,
|
|
236
|
-
|
|
236
|
+
user_experience_id: id,
|
|
237
237
|
feature_category: @definition.feature_category,
|
|
238
238
|
urgency: @definition.urgency,
|
|
239
239
|
start_time: @start_time,
|
|
@@ -275,7 +275,7 @@ module Labkit
|
|
|
275
275
|
end
|
|
276
276
|
|
|
277
277
|
def logger
|
|
278
|
-
Labkit::
|
|
278
|
+
Labkit::UserExperienceSli.configuration.logger
|
|
279
279
|
end
|
|
280
280
|
end
|
|
281
281
|
end
|
|
@@ -6,29 +6,29 @@ require 'pathname'
|
|
|
6
6
|
require 'yaml'
|
|
7
7
|
|
|
8
8
|
module Labkit
|
|
9
|
-
module
|
|
10
|
-
Definition = Data.define(:
|
|
9
|
+
module UserExperienceSli
|
|
10
|
+
Definition = Data.define(:user_experience_id, :description, :feature_category, :urgency)
|
|
11
11
|
|
|
12
12
|
class Registry
|
|
13
13
|
extend Forwardable
|
|
14
14
|
|
|
15
|
-
SCHEMA_PATH = File.expand_path('../../../config/
|
|
15
|
+
SCHEMA_PATH = File.expand_path('../../../config/user_experience_slis/schema.json', __dir__)
|
|
16
16
|
|
|
17
17
|
def_delegator :@experiences, :empty?
|
|
18
18
|
|
|
19
19
|
# @param dir [String, Pathname] Directory path containing YAML file definitions
|
|
20
|
-
# Defaults to 'config/
|
|
21
|
-
def initialize(dir: File.join("config", "
|
|
20
|
+
# Defaults to 'config/user_experience_slis' relative to the calling application's root
|
|
21
|
+
def initialize(dir: File.join("config", "user_experience_slis"))
|
|
22
22
|
@dir = Pathname.new(Dir.pwd).join(dir)
|
|
23
23
|
@experiences = load_on_demand
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
# Retrieve a definition experience given a
|
|
26
|
+
# Retrieve a definition experience given a user_experience_id.
|
|
27
27
|
#
|
|
28
|
-
# @param
|
|
28
|
+
# @param user_experience_id [String, Symbol] User experience SLI identifier
|
|
29
29
|
# @return [Experience, nil] An experience if present, otherwise nil
|
|
30
|
-
def [](
|
|
31
|
-
@experiences[
|
|
30
|
+
def [](user_experience_id)
|
|
31
|
+
@experiences[user_experience_id.to_s]
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
private
|
|
@@ -49,7 +49,7 @@ module Labkit
|
|
|
49
49
|
end
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
-
# Load a
|
|
52
|
+
# Load a user experience SLI definition.
|
|
53
53
|
#
|
|
54
54
|
# @param experience_id [String] Experience identifier
|
|
55
55
|
# @return [Experience, nil] Loaded experience or nil if not found/invalid
|
|
@@ -57,7 +57,7 @@ module Labkit
|
|
|
57
57
|
file_path = @dir.join("#{experience_id}.yml")
|
|
58
58
|
|
|
59
59
|
unless file_path.exist?
|
|
60
|
-
warn("Invalid
|
|
60
|
+
warn("Invalid User Experience definition: #{experience_id}")
|
|
61
61
|
return nil
|
|
62
62
|
end
|
|
63
63
|
|
|
@@ -78,7 +78,7 @@ module Labkit
|
|
|
78
78
|
return nil unless content.is_a?(Hash)
|
|
79
79
|
|
|
80
80
|
errors = JSON::Validator.fully_validate(schema, content)
|
|
81
|
-
return Definition.new(
|
|
81
|
+
return Definition.new(user_experience_id: experience_id, **content) if errors.empty?
|
|
82
82
|
|
|
83
83
|
warn("Invalid schema for #{file_path}")
|
|
84
84
|
|
|
@@ -98,7 +98,7 @@ module Labkit
|
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
def logger
|
|
101
|
-
Labkit::
|
|
101
|
+
Labkit::UserExperienceSli.configuration.logger
|
|
102
102
|
end
|
|
103
103
|
end
|
|
104
104
|
end
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'labkit/
|
|
4
|
-
require 'labkit/
|
|
5
|
-
require 'labkit/
|
|
6
|
-
require 'labkit/
|
|
7
|
-
require 'labkit/
|
|
3
|
+
require 'labkit/user_experience_sli/current'
|
|
4
|
+
require 'labkit/user_experience_sli/error'
|
|
5
|
+
require 'labkit/user_experience_sli/experience'
|
|
6
|
+
require 'labkit/user_experience_sli/null'
|
|
7
|
+
require 'labkit/user_experience_sli/registry'
|
|
8
8
|
require 'labkit/logging/json_logger'
|
|
9
9
|
|
|
10
10
|
module Labkit
|
|
11
|
-
# Labkit::
|
|
11
|
+
# Labkit::UserExperienceSli namespace module.
|
|
12
12
|
#
|
|
13
|
-
# This module is responsible for managing
|
|
13
|
+
# This module is responsible for managing user experience SLIs, which are
|
|
14
14
|
# specific events or activities within the application that are measured
|
|
15
15
|
# and reported for performance monitoring and analysis.
|
|
16
|
-
module
|
|
17
|
-
# Configuration class for
|
|
16
|
+
module UserExperienceSli
|
|
17
|
+
# Configuration class for UserExperienceSli
|
|
18
18
|
class Configuration
|
|
19
19
|
attr_accessor :logger, :registry_path
|
|
20
20
|
|
|
21
21
|
def initialize
|
|
22
22
|
@logger = Labkit::Logging::JsonLogger.new($stdout)
|
|
23
|
-
@registry_path = File.join("config", "
|
|
23
|
+
@registry_path = File.join("config", "user_experience_slis")
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
|
|
@@ -81,7 +81,7 @@ module Labkit
|
|
|
81
81
|
def raise_or_null(experience_id)
|
|
82
82
|
return Null.instance unless %w[development test].include?(ENV['RAILS_ENV'])
|
|
83
83
|
|
|
84
|
-
raise(NotFoundError, "
|
|
84
|
+
raise(NotFoundError, "User Experience #{experience_id} not found in the registry")
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
def find_current(experience_id)
|
|
@@ -93,4 +93,9 @@ module Labkit
|
|
|
93
93
|
end
|
|
94
94
|
end
|
|
95
95
|
end
|
|
96
|
+
|
|
97
|
+
# Backward compatibility alias for the old module name.
|
|
98
|
+
# This alias is kept to maintain compatibility with existing code.
|
|
99
|
+
# See: https://gitlab.com/gitlab-com/gl-infra/observability/team/-/issues/4347
|
|
100
|
+
CoveredExperience = UserExperienceSli
|
|
96
101
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gitlab-labkit
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andrew Newdigate
|
|
@@ -55,14 +55,14 @@ dependencies:
|
|
|
55
55
|
requirements:
|
|
56
56
|
- - ">="
|
|
57
57
|
- !ruby/object:Gem::Version
|
|
58
|
-
version: '1.
|
|
58
|
+
version: '1.75'
|
|
59
59
|
type: :runtime
|
|
60
60
|
prerelease: false
|
|
61
61
|
version_requirements: !ruby/object:Gem::Requirement
|
|
62
62
|
requirements:
|
|
63
63
|
- - ">="
|
|
64
64
|
- !ruby/object:Gem::Version
|
|
65
|
-
version: '1.
|
|
65
|
+
version: '1.75'
|
|
66
66
|
- !ruby/object:Gem::Dependency
|
|
67
67
|
name: google-protobuf
|
|
68
68
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -235,14 +235,14 @@ dependencies:
|
|
|
235
235
|
requirements:
|
|
236
236
|
- - ">="
|
|
237
237
|
- !ruby/object:Gem::Version
|
|
238
|
-
version: '1.
|
|
238
|
+
version: '1.75'
|
|
239
239
|
type: :development
|
|
240
240
|
prerelease: false
|
|
241
241
|
version_requirements: !ruby/object:Gem::Requirement
|
|
242
242
|
requirements:
|
|
243
243
|
- - ">="
|
|
244
244
|
- !ruby/object:Gem::Version
|
|
245
|
-
version: '1.
|
|
245
|
+
version: '1.75'
|
|
246
246
|
- !ruby/object:Gem::Dependency
|
|
247
247
|
name: httparty
|
|
248
248
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -447,8 +447,8 @@ files:
|
|
|
447
447
|
- LICENSE
|
|
448
448
|
- README.md
|
|
449
449
|
- Rakefile
|
|
450
|
-
- config/
|
|
451
|
-
- config/
|
|
450
|
+
- config/user_experience_slis/schema.json
|
|
451
|
+
- config/user_experience_slis/testing_sample.yml
|
|
452
452
|
- gitlab-labkit.gemspec
|
|
453
453
|
- lib/gitlab-labkit.rb
|
|
454
454
|
- lib/labkit/context.rb
|
|
@@ -458,13 +458,6 @@ files:
|
|
|
458
458
|
- lib/labkit/correlation/grpc/client_interceptor.rb
|
|
459
459
|
- lib/labkit/correlation/grpc/grpc_common.rb
|
|
460
460
|
- lib/labkit/correlation/grpc/server_interceptor.rb
|
|
461
|
-
- lib/labkit/covered_experience.rb
|
|
462
|
-
- lib/labkit/covered_experience/README.md
|
|
463
|
-
- lib/labkit/covered_experience/current.rb
|
|
464
|
-
- lib/labkit/covered_experience/error.rb
|
|
465
|
-
- lib/labkit/covered_experience/experience.rb
|
|
466
|
-
- lib/labkit/covered_experience/null.rb
|
|
467
|
-
- lib/labkit/covered_experience/registry.rb
|
|
468
461
|
- lib/labkit/excon_publisher.rb
|
|
469
462
|
- lib/labkit/fields.rb
|
|
470
463
|
- lib/labkit/fips.rb
|
|
@@ -487,18 +480,18 @@ files:
|
|
|
487
480
|
- lib/labkit/middleware/sidekiq/context.rb
|
|
488
481
|
- lib/labkit/middleware/sidekiq/context/client.rb
|
|
489
482
|
- lib/labkit/middleware/sidekiq/context/server.rb
|
|
490
|
-
- lib/labkit/middleware/sidekiq/covered_experience.rb
|
|
491
|
-
- lib/labkit/middleware/sidekiq/covered_experience/client.rb
|
|
492
|
-
- lib/labkit/middleware/sidekiq/covered_experience/server.rb
|
|
493
483
|
- lib/labkit/middleware/sidekiq/server.rb
|
|
494
484
|
- lib/labkit/middleware/sidekiq/tracing.rb
|
|
495
485
|
- lib/labkit/middleware/sidekiq/tracing/client.rb
|
|
496
486
|
- lib/labkit/middleware/sidekiq/tracing/server.rb
|
|
497
487
|
- lib/labkit/middleware/sidekiq/tracing/sidekiq_common.rb
|
|
488
|
+
- lib/labkit/middleware/sidekiq/user_experience_sli.rb
|
|
489
|
+
- lib/labkit/middleware/sidekiq/user_experience_sli/client.rb
|
|
490
|
+
- lib/labkit/middleware/sidekiq/user_experience_sli/server.rb
|
|
498
491
|
- lib/labkit/net_http_publisher.rb
|
|
499
492
|
- lib/labkit/rspec/README.md
|
|
500
493
|
- lib/labkit/rspec/matchers.rb
|
|
501
|
-
- lib/labkit/rspec/matchers/
|
|
494
|
+
- lib/labkit/rspec/matchers/user_experience_matchers.rb
|
|
502
495
|
- lib/labkit/system.rb
|
|
503
496
|
- lib/labkit/tracing.rb
|
|
504
497
|
- lib/labkit/tracing/abstract_instrumenter.rb
|
|
@@ -532,6 +525,13 @@ files:
|
|
|
532
525
|
- lib/labkit/tracing/redis/redis_interceptor_helper.rb
|
|
533
526
|
- lib/labkit/tracing/tracing_common.rb
|
|
534
527
|
- lib/labkit/tracing/tracing_utils.rb
|
|
528
|
+
- lib/labkit/user_experience_sli.rb
|
|
529
|
+
- lib/labkit/user_experience_sli/README.md
|
|
530
|
+
- lib/labkit/user_experience_sli/current.rb
|
|
531
|
+
- lib/labkit/user_experience_sli/error.rb
|
|
532
|
+
- lib/labkit/user_experience_sli/experience.rb
|
|
533
|
+
- lib/labkit/user_experience_sli/null.rb
|
|
534
|
+
- lib/labkit/user_experience_sli/registry.rb
|
|
535
535
|
- renovate.json
|
|
536
536
|
- scripts/install-asdf-plugins.sh
|
|
537
537
|
- scripts/prepare-dev-env.sh
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Labkit
|
|
4
|
-
module Middleware
|
|
5
|
-
module Sidekiq
|
|
6
|
-
# This module contains all the sidekiq middleware regarding covered
|
|
7
|
-
# experiences
|
|
8
|
-
module CoveredExperience
|
|
9
|
-
autoload :Client, "labkit/middleware/sidekiq/covered_experience/client"
|
|
10
|
-
autoload :Server, "labkit/middleware/sidekiq/covered_experience/server"
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
File without changes
|