Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
02f6aecd47
commit
e1faff6544
|
|
@ -737,7 +737,6 @@ RSpec/ContextWording:
|
|||
- 'ee/spec/services/geo/repository_sync_service_spec.rb'
|
||||
- 'ee/spec/services/geo/repository_verification_reset_spec.rb'
|
||||
- 'ee/spec/services/geo/wiki_sync_service_spec.rb'
|
||||
- 'ee/spec/services/gitlab_subscriptions/create_hand_raise_lead_service_spec.rb'
|
||||
- 'ee/spec/services/gitlab_subscriptions/create_service_spec.rb'
|
||||
- 'ee/spec/services/gitlab_subscriptions/preview_billable_user_change_service_spec.rb'
|
||||
- 'ee/spec/services/group_saml/group_managed_accounts/transfer_membership_service_spec.rb'
|
||||
|
|
|
|||
|
|
@ -69,7 +69,6 @@ RSpec/ExpectInHook:
|
|||
- 'ee/spec/services/geo/blob_download_service_spec.rb'
|
||||
- 'ee/spec/services/geo/project_housekeeping_service_spec.rb'
|
||||
- 'ee/spec/services/geo/registry_consistency_service_spec.rb'
|
||||
- 'ee/spec/services/gitlab_subscriptions/create_hand_raise_lead_service_spec.rb'
|
||||
- 'ee/spec/services/gitlab_subscriptions/fetch_subscription_plans_service_spec.rb'
|
||||
- 'ee/spec/services/gitlab_subscriptions/plan_upgrade_service_spec.rb'
|
||||
- 'ee/spec/services/gitlab_subscriptions/reconciliations/calculate_seat_count_data_service_spec.rb'
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
56ab62b8e3cf853560e2417fe239219c51f0b228
|
||||
3c844703332ab78c394328a9eb0250aac4e9eb93
|
||||
|
|
|
|||
|
|
@ -625,6 +625,7 @@ export default {
|
|||
<template #default="{ item, index, active }">
|
||||
<dynamic-scroller-item :item="item" :active="active" :class="{ active }">
|
||||
<diff-file
|
||||
v-if="active"
|
||||
:file="item"
|
||||
:reviewed="fileReviews[item.id]"
|
||||
:is-first-file="index === 0"
|
||||
|
|
|
|||
|
|
@ -86,7 +86,6 @@ export const handleLocationHash = () => {
|
|||
const performanceBar = document.querySelector('#js-peek');
|
||||
const topPadding = 8;
|
||||
const diffFileHeader = document.querySelector('.js-file-title');
|
||||
const versionMenusContainer = document.querySelector('.mr-version-menus-container');
|
||||
const fixedIssuableTitle = document.querySelector('.issue-sticky-header');
|
||||
|
||||
let adjustment = 0;
|
||||
|
|
@ -97,7 +96,6 @@ export const handleLocationHash = () => {
|
|||
adjustment -= getElementOffsetHeight(fixedTopBar);
|
||||
adjustment -= getElementOffsetHeight(performanceBar);
|
||||
adjustment -= getElementOffsetHeight(diffFileHeader);
|
||||
adjustment -= getElementOffsetHeight(versionMenusContainer);
|
||||
|
||||
if (isInIssuePage()) {
|
||||
adjustment -= getElementOffsetHeight(fixedIssuableTitle);
|
||||
|
|
|
|||
|
|
@ -1,4 +0,0 @@
|
|||
import { initSimpleApp } from '~/helpers/init_simple_app_helper';
|
||||
import ListIndex from '~/tracing/list_index.vue';
|
||||
|
||||
initSimpleApp('#js-tracing', ListIndex);
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
import { initSimpleApp } from '~/helpers/init_simple_app_helper';
|
||||
import DetailsIndex from '~/tracing/details_index.vue';
|
||||
|
||||
initSimpleApp('#js-tracing-details', DetailsIndex);
|
||||
|
|
@ -87,32 +87,16 @@ export default {
|
|||
return queryVariables;
|
||||
},
|
||||
result({ data }) {
|
||||
const blob = data.project?.repository?.blobs?.nodes[0] || {};
|
||||
this.initHighlightWorker(blob);
|
||||
const repository = data.project?.repository || {};
|
||||
this.blobInfo = repository.blobs?.nodes[0] || {};
|
||||
this.isEmptyRepository = repository.empty;
|
||||
|
||||
const urlHash = getLocationHash();
|
||||
const plain = this.$route?.query?.plain;
|
||||
const usePlain = this.$route?.query?.plain === '1'; // When the 'plain' URL param is present, its value determines which viewer to render
|
||||
const urlHash = getLocationHash(); // If there is a code line hash in the URL we render with the simple viewer
|
||||
const useSimpleViewer = usePlain || urlHash?.startsWith('L') || !this.hasRichViewer;
|
||||
|
||||
// When the 'plain' URL param is present, its value determines which viewer to render:
|
||||
// - when 0 and the rich viewer is available we render with it
|
||||
// - otherwise we render the simple viewer
|
||||
if (plain !== undefined) {
|
||||
if (plain === '0' && this.hasRichViewer) {
|
||||
this.switchViewer(RICH_BLOB_VIEWER);
|
||||
} else {
|
||||
this.switchViewer(SIMPLE_BLOB_VIEWER);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// If there is a code line hash in the URL we render with the simple viewer
|
||||
if (urlHash && urlHash.startsWith('L')) {
|
||||
this.switchViewer(SIMPLE_BLOB_VIEWER);
|
||||
return;
|
||||
}
|
||||
|
||||
// By default, if present, use the rich viewer to render
|
||||
this.switchViewer(this.hasRichViewer ? RICH_BLOB_VIEWER : SIMPLE_BLOB_VIEWER);
|
||||
this.initHighlightWorker(this.blobInfo);
|
||||
this.switchViewer(useSimpleViewer ? SIMPLE_BLOB_VIEWER : RICH_BLOB_VIEWER); // By default, if present, use the rich viewer to render
|
||||
},
|
||||
error() {
|
||||
this.displayError();
|
||||
|
|
@ -120,9 +104,7 @@ export default {
|
|||
},
|
||||
},
|
||||
provide() {
|
||||
return {
|
||||
blobHash: uniqueId(),
|
||||
};
|
||||
return { blobHash: uniqueId() };
|
||||
},
|
||||
props: {
|
||||
path: {
|
||||
|
|
@ -154,6 +136,8 @@ export default {
|
|||
useFallback: false,
|
||||
pathLocks: DEFAULT_BLOB_INFO.pathLocks,
|
||||
userPermissions: DEFAULT_BLOB_INFO.userPermissions,
|
||||
blobInfo: {},
|
||||
isEmptyRepository: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
|
@ -166,11 +150,6 @@ export default {
|
|||
isBinaryFileType() {
|
||||
return this.isBinary || this.blobInfo.simpleViewer?.fileType !== TEXT_FILE_TYPE;
|
||||
},
|
||||
blobInfo() {
|
||||
const nodes = this.project?.repository?.blobs?.nodes || [];
|
||||
|
||||
return nodes[0] || {};
|
||||
},
|
||||
currentRef() {
|
||||
return this.originalBranch || this.ref;
|
||||
},
|
||||
|
|
@ -245,16 +224,11 @@ export default {
|
|||
},
|
||||
watch: {
|
||||
// Watch the URL 'plain' query value to know if the viewer needs changing.
|
||||
// This is the case when the user switches the viewer and then goes back
|
||||
// through the hystory.
|
||||
// This is the case when the user switches the viewer and then goes back through the history
|
||||
'$route.query.plain': {
|
||||
handler(plainValue) {
|
||||
this.switchViewer(
|
||||
this.hasRichViewer && (plainValue === undefined || plainValue === '0')
|
||||
? RICH_BLOB_VIEWER
|
||||
: SIMPLE_BLOB_VIEWER,
|
||||
plainValue !== undefined,
|
||||
);
|
||||
const useSimpleViewer = plainValue === '1' || !this.hasRichViewer;
|
||||
this.switchViewer(useSimpleViewer ? SIMPLE_BLOB_VIEWER : RICH_BLOB_VIEWER);
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
@ -313,21 +287,11 @@ export default {
|
|||
this.loadLegacyViewer();
|
||||
}
|
||||
},
|
||||
updateRouteQuery() {
|
||||
const plain = this.activeViewerType === SIMPLE_BLOB_VIEWER ? '1' : '0';
|
||||
|
||||
if (this.$route?.query?.plain === plain) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.$router.push({
|
||||
path: this.$route.path,
|
||||
query: { ...this.$route.query, plain },
|
||||
});
|
||||
},
|
||||
handleViewerChanged(newViewer) {
|
||||
this.switchViewer(newViewer);
|
||||
this.updateRouteQuery();
|
||||
const plain = newViewer === SIMPLE_BLOB_VIEWER ? '1' : '0';
|
||||
if (this.$route?.query?.plain === plain) return;
|
||||
this.$router.push({ path: this.$route.path, query: { ...this.$route.query, plain } });
|
||||
},
|
||||
editBlob(target) {
|
||||
if (this.showForkSuggestion) {
|
||||
|
|
@ -393,7 +357,7 @@ export default {
|
|||
:delete-path="blobInfo.webPath"
|
||||
:can-push-code="userPermissions.pushCode"
|
||||
:can-push-to-branch="blobInfo.canCurrentUserPushToBranch"
|
||||
:empty-repo="project.repository.empty"
|
||||
:empty-repo="isEmptyRepository"
|
||||
:project-path="projectPath"
|
||||
:is-locked="Boolean(pathLockedByUser)"
|
||||
:can-lock="canLock"
|
||||
|
|
|
|||
|
|
@ -1,70 +0,0 @@
|
|||
import { s__, sprintf } from '~/locale';
|
||||
|
||||
// See https://design.gitlab.com/data-visualization/color/#categorical-data
|
||||
const SPAN_COLOR_WEIGHT = ['500', '600', '700', '800', '900', '950'];
|
||||
const SPAN_COLOR_PALETTE = ['blue', 'orange', 'aqua', 'green', 'magenta'];
|
||||
|
||||
export function durationNanoToMs(durationNano) {
|
||||
return Math.round(durationNano / 1000);
|
||||
}
|
||||
|
||||
export function formatDurationMs(durationMs) {
|
||||
return sprintf(s__('Tracing|%{ms} ms'), { ms: durationMs });
|
||||
}
|
||||
|
||||
export function formatTraceDuration(durationNano) {
|
||||
return formatDurationMs(durationNanoToMs(durationNano));
|
||||
}
|
||||
|
||||
function createPalette() {
|
||||
const palette = [];
|
||||
SPAN_COLOR_WEIGHT.forEach((w) => {
|
||||
SPAN_COLOR_PALETTE.forEach((c) => {
|
||||
palette.push(`${c}-${w}`);
|
||||
});
|
||||
});
|
||||
return palette;
|
||||
}
|
||||
|
||||
export function assignColorToServices(trace) {
|
||||
const services = Array.from(new Set(trace.spans.map((s) => s.service_name)));
|
||||
|
||||
const palette = createPalette();
|
||||
|
||||
const serviceToColor = {};
|
||||
services.forEach((s, i) => {
|
||||
serviceToColor[s] = palette[i % palette.length];
|
||||
});
|
||||
|
||||
return serviceToColor;
|
||||
}
|
||||
|
||||
const timestampToMs = (ts) => new Date(ts).getTime();
|
||||
|
||||
export function mapTraceToTreeRoot(trace) {
|
||||
const nodes = {};
|
||||
let root;
|
||||
|
||||
trace.spans.forEach((s) => {
|
||||
const node = {
|
||||
startTimeMs:
|
||||
root !== undefined ? timestampToMs(s.timestamp) - timestampToMs(root.timestamp) : 0,
|
||||
timestamp: s.timestamp,
|
||||
spanId: s.span_id,
|
||||
operation: s.operation,
|
||||
service: s.service_name,
|
||||
durationMs: durationNanoToMs(s.duration_nano),
|
||||
children: [],
|
||||
};
|
||||
nodes[s.span_id] = node;
|
||||
|
||||
const parentId = s.parent_span_id;
|
||||
if (parentId === '') {
|
||||
root = node;
|
||||
} else if (nodes[parentId]) {
|
||||
nodes[parentId].children.push(node);
|
||||
}
|
||||
});
|
||||
|
||||
return root;
|
||||
}
|
||||
|
|
@ -1,93 +0,0 @@
|
|||
<script>
|
||||
import { GlLoadingIcon } from '@gitlab/ui';
|
||||
import { s__ } from '~/locale';
|
||||
import { createAlert } from '~/alert';
|
||||
import { visitUrl, isSafeURL } from '~/lib/utils/url_utility';
|
||||
import TracingDetailsChart from './tracing_details_chart.vue';
|
||||
import TracingDetailsHeader from './tracing_details_header.vue';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
GlLoadingIcon,
|
||||
TracingDetailsChart,
|
||||
TracingDetailsHeader,
|
||||
},
|
||||
i18n: {
|
||||
error: s__('Tracing|Failed to load trace details.'),
|
||||
},
|
||||
props: {
|
||||
observabilityClient: {
|
||||
required: true,
|
||||
type: Object,
|
||||
},
|
||||
traceId: {
|
||||
required: true,
|
||||
type: String,
|
||||
},
|
||||
tracingIndexUrl: {
|
||||
required: true,
|
||||
type: String,
|
||||
validator: (val) => isSafeURL(val),
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
trace: null,
|
||||
loading: false,
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.validateAndFetch();
|
||||
},
|
||||
methods: {
|
||||
async validateAndFetch() {
|
||||
if (!this.traceId) {
|
||||
createAlert({
|
||||
message: this.$options.i18n.error,
|
||||
});
|
||||
}
|
||||
this.loading = true;
|
||||
try {
|
||||
const enabled = await this.observabilityClient.isTracingEnabled();
|
||||
if (enabled) {
|
||||
await this.fetchTrace();
|
||||
} else {
|
||||
this.goToTracingIndex();
|
||||
}
|
||||
} catch (e) {
|
||||
createAlert({
|
||||
message: this.$options.i18n.error,
|
||||
});
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
async fetchTrace() {
|
||||
this.loading = true;
|
||||
try {
|
||||
this.trace = await this.observabilityClient.fetchTrace(this.traceId);
|
||||
} catch (e) {
|
||||
createAlert({
|
||||
message: this.$options.i18n.error,
|
||||
});
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
goToTracingIndex() {
|
||||
visitUrl(this.tracingIndexUrl);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="loading" class="gl-py-5">
|
||||
<gl-loading-icon size="lg" />
|
||||
</div>
|
||||
|
||||
<div v-else-if="trace" data-testid="trace-details" class="gl-mx-7">
|
||||
<tracing-details-header :trace="trace" />
|
||||
<tracing-details-chart :trace="trace" />
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
<script>
|
||||
import TracingDetailsSpansChart from './tracing_details_spans_chart.vue';
|
||||
import { mapTraceToTreeRoot, durationNanoToMs, assignColorToServices } from './trace_utils';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
TracingDetailsSpansChart,
|
||||
},
|
||||
props: {
|
||||
trace: {
|
||||
required: true,
|
||||
type: Object,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
spans() {
|
||||
const root = mapTraceToTreeRoot(this.trace);
|
||||
return [root];
|
||||
},
|
||||
traceDurationMs() {
|
||||
return durationNanoToMs(this.trace.duration_nano);
|
||||
},
|
||||
serviceToColor() {
|
||||
return assignColorToServices(this.trace);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<tracing-details-spans-chart
|
||||
:spans="spans"
|
||||
:trace-duration-ms="traceDurationMs"
|
||||
:service-to-color="serviceToColor"
|
||||
/>
|
||||
</template>
|
||||
|
|
@ -1,93 +0,0 @@
|
|||
<script>
|
||||
import { GlCard } from '@gitlab/ui';
|
||||
import { formatDate } from '~/lib/utils/datetime/date_format_utility';
|
||||
import { formatTraceDuration } from './trace_utils';
|
||||
|
||||
const CARD_CLASS = 'gl-mr-7 gl-w-15p gl-min-w-fit-content';
|
||||
const HEADER_CLASS = 'gl-p-2 gl-font-weight-bold gl--flex-center';
|
||||
const BODY_CLASS =
|
||||
'gl--flex-center gl-flex-direction-column gl-my-0 gl-p-4 gl-font-weight-bold gl-text-center gl-flex-grow-1 gl-font-lg';
|
||||
|
||||
export default {
|
||||
CARD_CLASS,
|
||||
HEADER_CLASS,
|
||||
BODY_CLASS,
|
||||
components: {
|
||||
GlCard,
|
||||
},
|
||||
props: {
|
||||
trace: {
|
||||
required: true,
|
||||
type: Object,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
title() {
|
||||
return `${this.trace.service_name} : ${this.trace.operation}`;
|
||||
},
|
||||
traceDate() {
|
||||
return formatDate(this.trace.timestamp, 'mmm d, yyyy');
|
||||
},
|
||||
traceTime() {
|
||||
return formatDate(this.trace.timestamp, 'H:MM:ss Z');
|
||||
},
|
||||
traceDuration() {
|
||||
return formatTraceDuration(this.trace.duration_nano);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="gl-mb-6">
|
||||
<h1>{{ title }}</h1>
|
||||
|
||||
<div class="gl-display-flex gl-flex-wrap gl-justify-content-center gl-my-7 gl-row-gap-6">
|
||||
<gl-card
|
||||
data-testid="trace-date-card"
|
||||
:class="$options.CARD_CLASS"
|
||||
:body-class="$options.BODY_CLASS"
|
||||
:header-class="$options.HEADER_CLASS"
|
||||
>
|
||||
<template #header>
|
||||
{{ __('Trace Start') }}
|
||||
</template>
|
||||
|
||||
<template #default>
|
||||
<span>{{ traceDate }}</span>
|
||||
<span class="gl-text-secondary gl-font-weight-normal">{{ traceTime }}</span>
|
||||
</template>
|
||||
</gl-card>
|
||||
|
||||
<gl-card
|
||||
data-testid="trace-duration-card"
|
||||
:class="$options.CARD_CLASS"
|
||||
:body-class="$options.BODY_CLASS"
|
||||
:header-class="$options.HEADER_CLASS"
|
||||
>
|
||||
<template #header>
|
||||
{{ __('Duration') }}
|
||||
</template>
|
||||
|
||||
<template #default>
|
||||
<span>{{ traceDuration }}</span>
|
||||
</template>
|
||||
</gl-card>
|
||||
|
||||
<gl-card
|
||||
data-testid="trace-spans-card"
|
||||
:class="$options.CARD_CLASS"
|
||||
:body-class="$options.BODY_CLASS"
|
||||
:header-class="$options.HEADER_CLASS"
|
||||
>
|
||||
<template #header>
|
||||
{{ __('Total Spans') }}
|
||||
</template>
|
||||
|
||||
<template #default>
|
||||
<span>{{ trace.totalSpans }}</span>
|
||||
</template>
|
||||
</gl-card>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -1,141 +0,0 @@
|
|||
<script>
|
||||
import { GlButton, GlTruncate } from '@gitlab/ui';
|
||||
import { clamp } from 'lodash';
|
||||
import { formatDurationMs } from './trace_utils';
|
||||
|
||||
export default {
|
||||
name: 'TracingDetailsSpansChart',
|
||||
components: {
|
||||
GlButton,
|
||||
GlTruncate,
|
||||
},
|
||||
props: {
|
||||
spans: {
|
||||
required: true,
|
||||
type: Array,
|
||||
},
|
||||
traceDurationMs: {
|
||||
required: true,
|
||||
type: Number,
|
||||
},
|
||||
depth: {
|
||||
required: false,
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
serviceToColor: {
|
||||
required: true,
|
||||
type: Object,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
expanded: this.expandedState(this.spans),
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
spanDetailsStyle() {
|
||||
return {
|
||||
paddingLeft: `${this.depth * 16}px`,
|
||||
};
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
spans(_, newSpans) {
|
||||
this.expanded = this.expandedState(newSpans);
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
expandedState(spans) {
|
||||
return spans.map((x) => x.children.length > 0);
|
||||
},
|
||||
hasChildrenSpans(index) {
|
||||
return this.spans[index].children.length > 0;
|
||||
},
|
||||
toggleExpand(index) {
|
||||
if (!this.hasChildrenSpans(index)) return;
|
||||
|
||||
this.$set(this.expanded, index, !this.isExpanded(index));
|
||||
},
|
||||
isExpanded(index) {
|
||||
return this.expanded[index];
|
||||
},
|
||||
durationWrapperStyle(span) {
|
||||
const l = Math.floor((100 * span.startTimeMs) / this.traceDurationMs);
|
||||
return {
|
||||
marginLeft: `${l}%`,
|
||||
};
|
||||
},
|
||||
durationLineStyle(span) {
|
||||
const w = clamp((100 * span.durationMs) / this.traceDurationMs, 0.5, 100);
|
||||
return {
|
||||
width: `${w}%`,
|
||||
height: '32px',
|
||||
borderRadius: '4px',
|
||||
};
|
||||
},
|
||||
durationValue(span) {
|
||||
return formatDurationMs(span.durationMs);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="span-tree">
|
||||
<div
|
||||
v-for="(span, index) in spans"
|
||||
:key="span.span_id"
|
||||
:data-testid="`span-container-${depth}-${index}`"
|
||||
>
|
||||
<div class="gl-display-flex gl-border-b gl-hover-bg-t-gray-a-08">
|
||||
<div
|
||||
data-testid="span-details"
|
||||
class="gl-w-30p gl-min-w-20 gl-display-flex gl-flex-direction-row gl-p-3 gl-border-r"
|
||||
:style="spanDetailsStyle"
|
||||
>
|
||||
<div>
|
||||
<gl-button
|
||||
class="gl-mr-1"
|
||||
:class="{ invisible: !hasChildrenSpans(index) }"
|
||||
:icon="`chevron-${isExpanded(index) ? 'down' : 'up'}`"
|
||||
category="tertiary"
|
||||
size="small"
|
||||
@click="toggleExpand(index)"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="gl-display-flex gl-flex-direction-column gl-text-truncate">
|
||||
<gl-truncate
|
||||
class="gl-font-weight-bold gl-text-primary"
|
||||
:text="span.operation"
|
||||
with-tooltip
|
||||
/>
|
||||
<gl-truncate class="gl-text-secondary" :text="span.service" with-tooltip />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="gl-display-flex gl-flex-grow-1 gl-flex-direction-column gl-justify-content-center gl-px-4 gl-py-3"
|
||||
>
|
||||
<div :style="durationWrapperStyle(span)" data-testid="span-duration">
|
||||
<div
|
||||
data-testid="span-duration-bar"
|
||||
:style="durationLineStyle(span)"
|
||||
:class="`gl-bg-data-viz-${serviceToColor[span.service]}`"
|
||||
></div>
|
||||
<span class="gl-text-secondary">{{ durationValue(span) }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<tracing-details-spans-chart
|
||||
v-if="isExpanded(index)"
|
||||
:spans="span.children"
|
||||
:depth="depth + 1"
|
||||
:trace-duration-ms="traceDurationMs"
|
||||
:service-to-color="serviceToColor"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
<script>
|
||||
import EMPTY_TRACING_SVG from '@gitlab/svgs/dist/illustrations/monitoring/tracing.svg?url';
|
||||
import { GlEmptyState, GlButton } from '@gitlab/ui';
|
||||
import { s__ } from '~/locale';
|
||||
|
||||
export default {
|
||||
EMPTY_TRACING_SVG,
|
||||
name: 'TracingEmptyState',
|
||||
i18n: {
|
||||
title: s__('Tracing|Get started with Tracing'),
|
||||
description: s__('Tracing|Monitor your applications with GitLab Distributed Tracing.'),
|
||||
enableButtonText: s__('Tracing|Enable'),
|
||||
},
|
||||
components: {
|
||||
GlEmptyState,
|
||||
GlButton,
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<gl-empty-state :title="$options.i18n.title" :svg-path="$options.EMPTY_TRACING_SVG">
|
||||
<template #description>
|
||||
<div>
|
||||
<span>{{ $options.i18n.description }}</span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<template #actions>
|
||||
<gl-button variant="confirm" class="gl-mx-2 gl-mb-3" @click="$emit('enable-tracing')">
|
||||
{{ $options.i18n.enableButtonText }}
|
||||
</gl-button>
|
||||
</template>
|
||||
</gl-empty-state>
|
||||
</template>
|
||||
|
|
@ -1,125 +0,0 @@
|
|||
<script>
|
||||
import { GlLoadingIcon } from '@gitlab/ui';
|
||||
import { s__ } from '~/locale';
|
||||
import { createAlert } from '~/alert';
|
||||
import { visitUrl, joinPaths } from '~/lib/utils/url_utility';
|
||||
import UrlSync from '~/vue_shared/components/url_sync.vue';
|
||||
import {
|
||||
queryToFilterObj,
|
||||
filterObjToQuery,
|
||||
filterObjToFilterToken,
|
||||
filterTokensToFilterObj,
|
||||
} from '../filters';
|
||||
import TracingEmptyState from './tracing_empty_state.vue';
|
||||
import TracingTableList from './tracing_table_list.vue';
|
||||
import FilteredSearch from './tracing_list_filtered_search.vue';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
GlLoadingIcon,
|
||||
TracingTableList,
|
||||
TracingEmptyState,
|
||||
FilteredSearch,
|
||||
UrlSync,
|
||||
},
|
||||
props: {
|
||||
observabilityClient: {
|
||||
required: true,
|
||||
type: Object,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loading: true,
|
||||
/**
|
||||
* tracingEnabled: boolean | null.
|
||||
* null identifies a state where we don't know if tracing is enabled or not (e.g. when fetching the status from the API fails)
|
||||
*/
|
||||
tracingEnabled: null,
|
||||
traces: [],
|
||||
filters: queryToFilterObj(window.location.search),
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
query() {
|
||||
return filterObjToQuery(this.filters);
|
||||
},
|
||||
initialFilterValue() {
|
||||
return filterObjToFilterToken(this.filters);
|
||||
},
|
||||
},
|
||||
async created() {
|
||||
this.checkEnabled();
|
||||
},
|
||||
methods: {
|
||||
async checkEnabled() {
|
||||
this.loading = true;
|
||||
try {
|
||||
this.tracingEnabled = await this.observabilityClient.isTracingEnabled();
|
||||
if (this.tracingEnabled) {
|
||||
await this.fetchTraces();
|
||||
}
|
||||
} catch (e) {
|
||||
createAlert({
|
||||
message: s__('Tracing|Failed to load page.'),
|
||||
});
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
async enableTracing() {
|
||||
this.loading = true;
|
||||
try {
|
||||
await this.observabilityClient.enableTraces();
|
||||
this.tracingEnabled = true;
|
||||
await this.fetchTraces();
|
||||
} catch (e) {
|
||||
createAlert({
|
||||
message: s__('Tracing|Failed to enable tracing.'),
|
||||
});
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
async fetchTraces() {
|
||||
this.loading = true;
|
||||
try {
|
||||
const traces = await this.observabilityClient.fetchTraces(this.filters);
|
||||
this.traces = traces;
|
||||
} catch (e) {
|
||||
createAlert({
|
||||
message: s__('Tracing|Failed to load traces.'),
|
||||
});
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
selectTrace({ traceId }) {
|
||||
visitUrl(joinPaths(window.location.pathname, traceId));
|
||||
},
|
||||
handleFilters(filterTokens) {
|
||||
this.filters = filterTokensToFilterObj(filterTokens);
|
||||
this.fetchTraces();
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="loading" class="gl-py-5">
|
||||
<gl-loading-icon size="lg" />
|
||||
</div>
|
||||
|
||||
<template v-else-if="tracingEnabled !== null">
|
||||
<tracing-empty-state v-if="tracingEnabled === false" @enable-tracing="enableTracing" />
|
||||
|
||||
<template v-else>
|
||||
<filtered-search :initial-filters="initialFilterValue" @submit="handleFilters" />
|
||||
<url-sync :query="query" />
|
||||
|
||||
<tracing-table-list :traces="traces" @reload="fetchTraces" @trace-selected="selectTrace" />
|
||||
</template>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -1,87 +0,0 @@
|
|||
<script>
|
||||
import { GlFilteredSearch, GlFilteredSearchToken } from '@gitlab/ui';
|
||||
import { s__ } from '~/locale';
|
||||
import {
|
||||
OPERATORS_IS,
|
||||
OPERATORS_IS_NOT,
|
||||
} from '~/vue_shared/components/filtered_search_bar/constants';
|
||||
import {
|
||||
PERIOD_FILTER_TOKEN_TYPE,
|
||||
SERVICE_NAME_FILTER_TOKEN_TYPE,
|
||||
OPERATION_FILTER_TOKEN_TYPE,
|
||||
TRACE_ID_FILTER_TOKEN_TYPE,
|
||||
DURATION_MS_FILTER_TOKEN_TYPE,
|
||||
} from '../filters';
|
||||
|
||||
export default {
|
||||
availableTokens: [
|
||||
{
|
||||
title: s__('Tracing|Period'),
|
||||
icon: 'clock',
|
||||
type: PERIOD_FILTER_TOKEN_TYPE,
|
||||
token: GlFilteredSearchToken,
|
||||
operators: OPERATORS_IS,
|
||||
unique: true,
|
||||
options: [
|
||||
{ value: '1m', title: s__('Tracing|Last 1 minute') },
|
||||
{ value: '15m', title: s__('Tracing|Last 15 minutes') },
|
||||
{ value: '30m', title: s__('Tracing|Last 30 minutes') },
|
||||
{ value: '1h', title: s__('Tracing|Last 1 hour') },
|
||||
{ value: '24h', title: s__('Tracing|Last 24 hours') },
|
||||
{ value: '7d', title: s__('Tracing|Last 7 days') },
|
||||
{ value: '14d', title: s__('Tracing|Last 14 days') },
|
||||
{ value: '30d', title: s__('Tracing|Last 30 days') },
|
||||
],
|
||||
},
|
||||
{
|
||||
title: s__('Tracing|Service'),
|
||||
type: SERVICE_NAME_FILTER_TOKEN_TYPE,
|
||||
token: GlFilteredSearchToken,
|
||||
operators: OPERATORS_IS_NOT,
|
||||
},
|
||||
{
|
||||
title: s__('Tracing|Operation'),
|
||||
type: OPERATION_FILTER_TOKEN_TYPE,
|
||||
token: GlFilteredSearchToken,
|
||||
operators: OPERATORS_IS_NOT,
|
||||
},
|
||||
{
|
||||
title: s__('Tracing|Trace ID'),
|
||||
type: TRACE_ID_FILTER_TOKEN_TYPE,
|
||||
token: GlFilteredSearchToken,
|
||||
operators: OPERATORS_IS_NOT,
|
||||
},
|
||||
{
|
||||
title: s__('Tracing|Duration (ms)'),
|
||||
type: DURATION_MS_FILTER_TOKEN_TYPE,
|
||||
token: GlFilteredSearchToken,
|
||||
operators: [
|
||||
{ value: '>', description: s__('Tracing|longer than') },
|
||||
{ value: '<', description: s__('Tracing|shorter than') },
|
||||
],
|
||||
},
|
||||
],
|
||||
components: {
|
||||
GlFilteredSearch,
|
||||
},
|
||||
props: {
|
||||
initialFilters: {
|
||||
type: Array,
|
||||
required: false,
|
||||
default: () => [],
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="vue-filtered-search-bar-container row-content-block gl-border-t-none">
|
||||
<gl-filtered-search
|
||||
:value="initialFilters"
|
||||
terms-as-tokens
|
||||
:placeholder="s__('Tracing|Filter Traces')"
|
||||
:available-tokens="$options.availableTokens"
|
||||
@submit="$emit('submit', $event)"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -1,104 +0,0 @@
|
|||
<script>
|
||||
import { GlTable, GlLink, GlTruncate } from '@gitlab/ui';
|
||||
import { s__ } from '~/locale';
|
||||
import { formatDate } from '~/lib/utils/datetime/date_format_utility';
|
||||
import { formatTraceDuration } from './trace_utils';
|
||||
|
||||
export const tableDataClass = 'gl-display-flex gl-md-display-table-cell gl-align-items-center';
|
||||
export default {
|
||||
name: 'TracingTableList',
|
||||
i18n: {
|
||||
title: s__('Tracing|Traces'),
|
||||
emptyText: s__('Tracing|No traces to display.'),
|
||||
emptyLinkText: s__('Tracing|Check again'),
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
key: 'timestamp',
|
||||
label: s__('Tracing|Date'),
|
||||
tdClass: tableDataClass,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
key: 'service_name',
|
||||
label: s__('Tracing|Service'),
|
||||
tdClass: tableDataClass,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
key: 'operation',
|
||||
label: s__('Tracing|Operation'),
|
||||
tdClass: tableDataClass,
|
||||
sortable: true,
|
||||
},
|
||||
{
|
||||
key: 'duration',
|
||||
label: s__('Tracing|Duration'),
|
||||
thClass: 'gl-w-15p',
|
||||
tdClass: tableDataClass,
|
||||
sortable: true,
|
||||
},
|
||||
],
|
||||
components: {
|
||||
GlTable,
|
||||
GlLink,
|
||||
GlTruncate,
|
||||
},
|
||||
props: {
|
||||
traces: {
|
||||
required: true,
|
||||
type: Array,
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
formattedTraces() {
|
||||
return this.traces.map((x) => ({
|
||||
...x,
|
||||
timestamp: formatDate(x.timestamp),
|
||||
duration: formatTraceDuration(x.duration_nano),
|
||||
}));
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
onSelect(items) {
|
||||
if (items[0]) {
|
||||
this.$emit('trace-selected', { traceId: items[0].trace_id });
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<h4 class="gl-display-block gl-md-display-none! gl-my-5">{{ $options.i18n.title }}</h4>
|
||||
|
||||
<gl-table
|
||||
:items="formattedTraces"
|
||||
:fields="$options.fields"
|
||||
show-empty
|
||||
sort-by="timestamp"
|
||||
:sort-desc="true"
|
||||
fixed
|
||||
stacked="md"
|
||||
tbody-tr-class="table-row"
|
||||
selectable
|
||||
select-mode="single"
|
||||
selected-variant=""
|
||||
@row-selected="onSelect"
|
||||
>
|
||||
<template #cell(service_name)="{ item }">
|
||||
<gl-truncate :text="item.service_name" with-tooltip />
|
||||
</template>
|
||||
|
||||
<template #cell(operation)="{ item }">
|
||||
<gl-truncate :text="item.operation" with-tooltip />
|
||||
</template>
|
||||
|
||||
<template #empty>
|
||||
{{ $options.i18n.emptyText }}
|
||||
<gl-link @click="$emit('reload')">{{ $options.i18n.emptyLinkText }}</gl-link>
|
||||
</template>
|
||||
</gl-table>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
<script>
|
||||
import ObservabilityContainer from '~/observability/components/observability_container.vue';
|
||||
import TracingDetails from './components/tracing_details.vue';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
ObservabilityContainer,
|
||||
TracingDetails,
|
||||
},
|
||||
props: {
|
||||
traceId: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
oauthUrl: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
tracingUrl: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
provisioningUrl: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
tracingIndexUrl: {
|
||||
required: true,
|
||||
type: String,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<observability-container
|
||||
:oauth-url="oauthUrl"
|
||||
:tracing-url="tracingUrl"
|
||||
:provisioning-url="provisioningUrl"
|
||||
>
|
||||
<template #default="{ observabilityClient }">
|
||||
<tracing-details
|
||||
:trace-id="traceId"
|
||||
:tracing-index-url="tracingIndexUrl"
|
||||
:observability-client="observabilityClient"
|
||||
/>
|
||||
</template>
|
||||
</observability-container>
|
||||
</template>
|
||||
|
|
@ -1,104 +0,0 @@
|
|||
import {
|
||||
filterToQueryObject,
|
||||
urlQueryToFilter,
|
||||
prepareTokens,
|
||||
processFilters,
|
||||
} from '~/vue_shared/components/filtered_search_bar/filtered_search_utils';
|
||||
import { FILTERED_SEARCH_TERM } from '~/vue_shared/components/filtered_search_bar/constants';
|
||||
|
||||
export const PERIOD_FILTER_TOKEN_TYPE = 'period';
|
||||
export const SERVICE_NAME_FILTER_TOKEN_TYPE = 'service-name';
|
||||
export const OPERATION_FILTER_TOKEN_TYPE = 'operation';
|
||||
export const TRACE_ID_FILTER_TOKEN_TYPE = 'trace-id';
|
||||
export const DURATION_MS_FILTER_TOKEN_TYPE = 'duration-ms';
|
||||
|
||||
export function queryToFilterObj(url) {
|
||||
const filter = urlQueryToFilter(url, {
|
||||
filteredSearchTermKey: 'search',
|
||||
customOperators: [
|
||||
{
|
||||
operator: '>',
|
||||
prefix: 'gt',
|
||||
},
|
||||
{
|
||||
operator: '<',
|
||||
prefix: 'lt',
|
||||
},
|
||||
],
|
||||
});
|
||||
const {
|
||||
period = null,
|
||||
service = null,
|
||||
operation = null,
|
||||
trace_id: traceId = null,
|
||||
durationMs = null,
|
||||
} = filter;
|
||||
const search = filter[FILTERED_SEARCH_TERM];
|
||||
return {
|
||||
period,
|
||||
service,
|
||||
operation,
|
||||
traceId,
|
||||
durationMs,
|
||||
search,
|
||||
};
|
||||
}
|
||||
|
||||
export function filterObjToQuery(filters) {
|
||||
return filterToQueryObject(
|
||||
{
|
||||
period: filters.period,
|
||||
service: filters.serviceName,
|
||||
operation: filters.operation,
|
||||
trace_id: filters.traceId,
|
||||
durationMs: filters.durationMs,
|
||||
[FILTERED_SEARCH_TERM]: filters.search,
|
||||
},
|
||||
{
|
||||
filteredSearchTermKey: 'search',
|
||||
customOperators: [
|
||||
{
|
||||
operator: '>',
|
||||
prefix: 'gt',
|
||||
applyOnlyToKey: 'durationMs',
|
||||
},
|
||||
{
|
||||
operator: '<',
|
||||
prefix: 'lt',
|
||||
applyOnlyToKey: 'durationMs',
|
||||
},
|
||||
],
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export function filterObjToFilterToken(filters) {
|
||||
return prepareTokens({
|
||||
[PERIOD_FILTER_TOKEN_TYPE]: filters.period,
|
||||
[SERVICE_NAME_FILTER_TOKEN_TYPE]: filters.serviceName,
|
||||
[OPERATION_FILTER_TOKEN_TYPE]: filters.operation,
|
||||
[TRACE_ID_FILTER_TOKEN_TYPE]: filters.traceId,
|
||||
[DURATION_MS_FILTER_TOKEN_TYPE]: filters.durationMs,
|
||||
[FILTERED_SEARCH_TERM]: filters.search,
|
||||
});
|
||||
}
|
||||
|
||||
export function filterTokensToFilterObj(tokens) {
|
||||
const {
|
||||
[SERVICE_NAME_FILTER_TOKEN_TYPE]: serviceName,
|
||||
[PERIOD_FILTER_TOKEN_TYPE]: period,
|
||||
[OPERATION_FILTER_TOKEN_TYPE]: operation,
|
||||
[TRACE_ID_FILTER_TOKEN_TYPE]: traceId,
|
||||
[DURATION_MS_FILTER_TOKEN_TYPE]: durationMs,
|
||||
[FILTERED_SEARCH_TERM]: search,
|
||||
} = processFilters(tokens);
|
||||
|
||||
return {
|
||||
serviceName,
|
||||
period,
|
||||
operation,
|
||||
traceId,
|
||||
durationMs,
|
||||
search,
|
||||
};
|
||||
}
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
<script>
|
||||
import ObservabilityContainer from '~/observability/components/observability_container.vue';
|
||||
import TracingList from './components/tracing_list.vue';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
ObservabilityContainer,
|
||||
TracingList,
|
||||
},
|
||||
props: {
|
||||
oauthUrl: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
tracingUrl: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
provisioningUrl: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<observability-container
|
||||
:oauth-url="oauthUrl"
|
||||
:tracing-url="tracingUrl"
|
||||
:provisioning-url="provisioningUrl"
|
||||
>
|
||||
<template #default="{ observabilityClient }">
|
||||
<tracing-list :observability-client="observabilityClient" />
|
||||
</template>
|
||||
</observability-container>
|
||||
</template>
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Projects
|
||||
class TracingController < Projects::ApplicationController
|
||||
include ::Observability::ContentSecurityPolicy
|
||||
|
||||
feature_category :tracing
|
||||
|
||||
before_action :check_tracing_enabled
|
||||
|
||||
def index; end
|
||||
|
||||
def show
|
||||
@trace_id = params[:id]
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def check_tracing_enabled
|
||||
render_404 unless Gitlab::Observability.tracing_enabled?(project)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Projects
|
||||
module ObservabilityHelper
|
||||
def observability_tracing_view_model(project)
|
||||
Gitlab::Json.generate({
|
||||
tracingUrl: Gitlab::Observability.tracing_url(project),
|
||||
provisioningUrl: Gitlab::Observability.provisioning_url(project),
|
||||
oauthUrl: Gitlab::Observability.oauth_url
|
||||
})
|
||||
end
|
||||
|
||||
def observability_tracing_details_model(project, trace_id)
|
||||
Gitlab::Json.generate({
|
||||
tracingIndexUrl: namespace_project_tracing_index_path(project.group, project),
|
||||
traceId: trace_id,
|
||||
tracingUrl: Gitlab::Observability.tracing_url(project),
|
||||
provisioningUrl: Gitlab::Observability.provisioning_url(project),
|
||||
oauthUrl: Gitlab::Observability.oauth_url
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -24,11 +24,5 @@
|
|||
%br
|
||||
= link_to "Unsubscribe", @unsubscribe_url
|
||||
|
||||
-# EE-specific start
|
||||
- if Gitlab::CurrentSettings.email_additional_text.present?
|
||||
%br
|
||||
%br
|
||||
= Gitlab::Utils.nlbr(Gitlab::CurrentSettings.email_additional_text)
|
||||
-# EE-specific end
|
||||
|
||||
= render_if_exists 'layouts/email_additional_text'
|
||||
= html_footer_message
|
||||
|
|
|
|||
|
|
@ -1,4 +0,0 @@
|
|||
- page_title _('Tracing')
|
||||
|
||||
#js-tracing{ data: { view_model: observability_tracing_view_model(@project) } }
|
||||
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
- @no_container = true
|
||||
|
||||
- page_title _('Trace Details')
|
||||
- add_to_breadcrumbs _('Tracing'), project_tracing_index_path(@project)
|
||||
|
||||
#js-tracing-details{ data: { view_model: observability_tracing_details_model(@project, @trace_id) } }
|
||||
|
||||
|
|
@ -7,4 +7,4 @@
|
|||
%p
|
||||
= _("You are receiving this message because you are a GitLab administrator for %{url}.") % { url: Gitlab.config.gitlab.url }
|
||||
|
||||
= render_if_exists 'repository_check_mailer/email_additional_text'
|
||||
= render_if_exists 'shared/additional_email_text'
|
||||
|
|
|
|||
|
|
@ -4,4 +4,4 @@
|
|||
|
||||
= _("You are receiving this message because you are a GitLab administrator for %{url}.") % { url: Gitlab.config.gitlab.url }
|
||||
|
||||
= render_if_exists 'repository_check_mailer/email_additional_text'
|
||||
= render_if_exists 'shared/additional_email_text'
|
||||
|
|
|
|||
|
|
@ -383,8 +383,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
|
|||
end
|
||||
end
|
||||
|
||||
resources :tracing, only: [:index, :show], controller: :tracing
|
||||
|
||||
namespace :design_management do
|
||||
namespace :designs, path: 'designs/:design_id(/:sha)', constraints: -> (params) { params[:sha].nil? || Gitlab::Git.commit_id?(params[:sha]) } do
|
||||
resource :raw_image, only: :show
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: reference
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: concepts, howto
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: reference
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: index
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: reference
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: reference
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: reference
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: reference
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: reference
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
type: howto
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -174,8 +174,7 @@ http://secondary.example.com/
|
|||
Health Status: Healthy
|
||||
Repositories: succeeded 12345 / total 12345 (100%)
|
||||
Verified Repositories: succeeded 12345 / total 12345 (100%)
|
||||
Wikis: succeeded 6789 / total 6789 (100%)
|
||||
Verified Wikis: succeeded 6789 / total 6789 (100%)
|
||||
Project Wiki Repositories: succeeded 6789 / total 6789 (100%)
|
||||
Attachments: succeeded 4 / total 4 (100%)
|
||||
CI job artifacts: succeeded 0 / total 0 (0%)
|
||||
Design repositories: succeeded 1 / total 1 (100%)
|
||||
|
|
@ -192,6 +191,7 @@ http://secondary.example.com/
|
|||
Terraform State Versions Verified: succeeded 0 / total 10 (0%)
|
||||
Snippet Repositories Verified: succeeded 99 / total 100 (99%)
|
||||
Pipeline Artifacts Verified: succeeded 0 / total 10 (0%)
|
||||
Project Wiki Repositories Verified: succeeded 6789 / total 6789 (100%)
|
||||
Sync Settings: Full
|
||||
Database replication lag: 0 seconds
|
||||
Last event ID seen from primary: 12345 (about 2 minutes ago)
|
||||
|
|
|
|||
|
|
@ -7,6 +7,9 @@ type: reference, howto
|
|||
|
||||
# Diagrams.net **(FREE SELF)**
|
||||
|
||||
> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86206) in GitLab 15.10.
|
||||
> - Offline environment support [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/116281) in GitLab 16.1.
|
||||
|
||||
With the [diagrams.net](https://www.diagrams.net/) integration, you can create and embed SVG diagrams in wikis.
|
||||
The diagram editor is available in both the plain text editor and the rich text editor.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
type: howto
|
||||
|
|
|
|||
|
|
@ -250,18 +250,12 @@ configuration option in `gitlab.yml`. These metrics are served from the
|
|||
| `geo_job_artifacts_synced_missing_on_primary` | Gauge | 10.7 | Number of job artifacts marked as synced due to the file missing on the primary | `url` |
|
||||
| `geo_repositories_checksummed` | Gauge | 10.7 | Number of repositories checksummed on primary | `url` |
|
||||
| `geo_repositories_checksum_failed` | Gauge | 10.7 | Number of repositories failed to calculate the checksum on primary | `url` |
|
||||
| `geo_wikis_checksummed` | Gauge | 10.7 | Number of wikis checksummed on primary | `url` |
|
||||
| `geo_wikis_checksum_failed` | Gauge | 10.7 | Number of wikis failed to calculate the checksum on primary | `url` |
|
||||
| `geo_repositories_verified` | Gauge | 10.7 | Number of repositories successfully verified on secondary | `url` |
|
||||
| `geo_repositories_verification_failed` | Gauge | 10.7 | Number of repositories that failed verification on secondary | `url` |
|
||||
| `geo_repositories_checksum_mismatch` | Gauge | 10.7 | Number of repositories that checksum mismatch on secondary | `url` |
|
||||
| `geo_wikis_verified` | Gauge | 10.7 | Number of wikis successfully verified on secondary | `url` |
|
||||
| `geo_wikis_verification_failed` | Gauge | 10.7 | Number of wikis that failed verification on secondary | `url` |
|
||||
| `geo_wikis_checksum_mismatch` | Gauge | 10.7 | Number of wikis that checksum mismatch on secondary | `url` |
|
||||
| `geo_repositories_checked` | Gauge | 11.1 | Number of repositories that have been checked via `git fsck` | `url` |
|
||||
| `geo_repositories_checked_failed` | Gauge | 11.1 | Number of repositories that have a failure from `git fsck` | `url` |
|
||||
| `geo_repositories_retrying_verification` | Gauge | 11.2 | Number of repositories verification failures that Geo is actively trying to correct on secondary | `url` |
|
||||
| `geo_wikis_retrying_verification` | Gauge | 11.2 | Number of wikis verification failures that Geo is actively trying to correct on secondary | `url` |
|
||||
| `geo_package_files` | Gauge | 13.0 | Number of package files on primary | `url` |
|
||||
| `geo_package_files_checksummed` | Gauge | 13.0 | Number of package files checksummed on primary | `url` |
|
||||
| `geo_package_files_checksum_failed` | Gauge | 13.0 | Number of package files failed to calculate the checksum on primary | `url` |
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: reference
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: reference, howto
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments"
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -343,10 +343,6 @@ Example response:
|
|||
"repositories_failed_count": null,
|
||||
"repositories_synced_count": null,
|
||||
"repositories_synced_in_percentage": "0.00%",
|
||||
"wikis_count": 41,
|
||||
"wikis_failed_count": null,
|
||||
"wikis_synced_count": null,
|
||||
"wikis_synced_in_percentage": "0.00%",
|
||||
"replication_slots_count": 1,
|
||||
"replication_slots_used_count": 1,
|
||||
"replication_slots_used_in_percentage": "100.00%",
|
||||
|
|
@ -357,19 +353,11 @@ Example response:
|
|||
"repositories_checksummed_count": 20,
|
||||
"repositories_checksum_failed_count": 5,
|
||||
"repositories_checksummed_in_percentage": "48.78%",
|
||||
"wikis_checksummed_count": 10,
|
||||
"wikis_checksum_failed_count": 3,
|
||||
"wikis_checksummed_in_percentage": "24.39%",
|
||||
"repositories_verified_count": 20,
|
||||
"repositories_verification_failed_count": 5,
|
||||
"repositories_verified_in_percentage": "48.78%",
|
||||
"repositories_checksum_mismatch_count": 3,
|
||||
"wikis_verified_count": 10,
|
||||
"wikis_verification_failed_count": 3,
|
||||
"wikis_verified_in_percentage": "24.39%",
|
||||
"wikis_checksum_mismatch_count": 1,
|
||||
"repositories_retrying_verification_count": 1,
|
||||
"wikis_retrying_verification_count": 3,
|
||||
"last_event_id": 23,
|
||||
"last_event_timestamp": 1509681166,
|
||||
"cursor_last_event_id": null,
|
||||
|
|
@ -619,10 +607,6 @@ Example response:
|
|||
"repositories_failed_count": 1,
|
||||
"repositories_synced_count": 40,
|
||||
"repositories_synced_in_percentage": "97.56%",
|
||||
"wikis_count": 41,
|
||||
"wikis_failed_count": 0,
|
||||
"wikis_synced_count": 41,
|
||||
"wikis_synced_in_percentage": "100.00%",
|
||||
"replication_slots_count": null,
|
||||
"replication_slots_used_count": null,
|
||||
"replication_slots_used_in_percentage": "0.00%",
|
||||
|
|
@ -630,19 +614,11 @@ Example response:
|
|||
"repositories_checksummed_count": 20,
|
||||
"repositories_checksum_failed_count": 5,
|
||||
"repositories_checksummed_in_percentage": "48.78%",
|
||||
"wikis_checksummed_count": 10,
|
||||
"wikis_checksum_failed_count": 3,
|
||||
"wikis_checksummed_in_percentage": "24.39%",
|
||||
"repositories_verified_count": 20,
|
||||
"repositories_verification_failed_count": 5,
|
||||
"repositories_verified_in_percentage": "48.78%",
|
||||
"repositories_checksum_mismatch_count": 3,
|
||||
"wikis_verified_count": 10,
|
||||
"wikis_verification_failed_count": 3,
|
||||
"wikis_verified_in_percentage": "24.39%",
|
||||
"wikis_checksum_mismatch_count": 1,
|
||||
"repositories_retrying_verification_count": 4,
|
||||
"wikis_retrying_verification_count": 2,
|
||||
"repositories_checked_count": 5,
|
||||
"repositories_checked_failed_count": 1,
|
||||
"repositories_checked_in_percentage": "12.20%",
|
||||
|
|
@ -850,10 +826,6 @@ Example response:
|
|||
"repositories_failed_count": 1,
|
||||
"repositories_synced_count": 40,
|
||||
"repositories_synced_in_percentage": "97.56%",
|
||||
"wikis_count": 41,
|
||||
"wikis_failed_count": 0,
|
||||
"wikis_synced_count": 41,
|
||||
"wikis_synced_in_percentage": "100.00%",
|
||||
"replication_slots_count": null,
|
||||
"replication_slots_used_count": null,
|
||||
"replication_slots_used_in_percentage": "0.00%",
|
||||
|
|
|
|||
|
|
@ -296,25 +296,15 @@ Example response:
|
|||
"repositories_replication_enabled": null,
|
||||
"repositories_synced_count": null,
|
||||
"repositories_failed_count": null,
|
||||
"wikis_synced_count": null,
|
||||
"wikis_failed_count": null,
|
||||
"repositories_verified_count": null,
|
||||
"repositories_verification_failed_count": null,
|
||||
"repositories_verification_total_count": null,
|
||||
"wikis_verified_count": null,
|
||||
"wikis_verification_failed_count": null,
|
||||
"wikis_verification_total_count": null,
|
||||
"job_artifacts_synced_missing_on_primary_count": null,
|
||||
"repositories_checksummed_count": 19,
|
||||
"repositories_checksum_failed_count": 0,
|
||||
"repositories_checksum_mismatch_count": null,
|
||||
"repositories_checksum_total_count": 19,
|
||||
"wikis_checksummed_count": 0,
|
||||
"wikis_checksum_failed_count": 0,
|
||||
"wikis_checksum_mismatch_count": null,
|
||||
"wikis_checksum_total_count": 19,
|
||||
"repositories_retrying_verification_count": null,
|
||||
"wikis_retrying_verification_count": null,
|
||||
"projects_count": 19,
|
||||
"container_repositories_replication_enabled": null,
|
||||
"design_repositories_replication_enabled": null,
|
||||
|
|
@ -479,9 +469,6 @@ Example response:
|
|||
"repositories_checksummed_in_percentage": "100.00%",
|
||||
"repositories_verified_in_percentage": "0.00%",
|
||||
"repositories_checked_in_percentage": "0.00%",
|
||||
"wikis_synced_in_percentage": "0.00%",
|
||||
"wikis_checksummed_in_percentage": "0.00%",
|
||||
"wikis_verified_in_percentage": "0.00%",
|
||||
"replication_slots_used_in_percentage": "100.00%",
|
||||
"design_repositories_synced_in_percentage": "0.00%",
|
||||
"lfs_objects_synced_in_percentage": "0.00%",
|
||||
|
|
@ -515,7 +502,6 @@ Example response:
|
|||
"project_wiki_repositories_synced_in_percentage": "0.00%",
|
||||
"project_wiki_repositories_verified_in_percentage": "0.00%",
|
||||
"repositories_count": 19,
|
||||
"wikis_count": 19,
|
||||
"replication_slots_count": 1,
|
||||
"replication_slots_used_count": 1,
|
||||
"healthy": true,
|
||||
|
|
@ -548,25 +534,15 @@ Example response:
|
|||
"repositories_replication_enabled": true,
|
||||
"repositories_synced_count": 18,
|
||||
"repositories_failed_count": 0,
|
||||
"wikis_synced_count": 18,
|
||||
"wikis_failed_count": 0,
|
||||
"repositories_verified_count": 0,
|
||||
"repositories_verification_failed_count": 0,
|
||||
"repositories_verification_total_count": 19,
|
||||
"wikis_verified_count": 0,
|
||||
"wikis_verification_failed_count": 0,
|
||||
"wikis_verification_total_count": 19,
|
||||
"job_artifacts_synced_missing_on_primary_count": null,
|
||||
"repositories_checksummed_count": null,
|
||||
"repositories_checksum_failed_count": null,
|
||||
"repositories_checksum_mismatch_count": 0,
|
||||
"repositories_checksum_total_count": null,
|
||||
"wikis_checksummed_count": null,
|
||||
"wikis_checksum_failed_count": null,
|
||||
"wikis_checksum_mismatch_count": 0,
|
||||
"wikis_checksum_total_count": null,
|
||||
"repositories_retrying_verification_count": 0,
|
||||
"wikis_retrying_verification_count": 0,
|
||||
"projects_count": 19,
|
||||
"container_repositories_replication_enabled": null,
|
||||
"design_repositories_replication_enabled": true,
|
||||
|
|
@ -731,9 +707,6 @@ Example response:
|
|||
"repositories_checksummed_in_percentage": "0.00%",
|
||||
"repositories_verified_in_percentage": "0.00%",
|
||||
"repositories_checked_in_percentage": "0.00%",
|
||||
"wikis_synced_in_percentage": "94.74%",
|
||||
"wikis_checksummed_in_percentage": "0.00%",
|
||||
"wikis_verified_in_percentage": "0.00%",
|
||||
"replication_slots_used_in_percentage": "0.00%",
|
||||
"design_repositories_synced_in_percentage": "0.00%",
|
||||
"lfs_objects_synced_in_percentage": "0.00%",
|
||||
|
|
@ -767,7 +740,6 @@ Example response:
|
|||
"project_wiki_repositories_synced_in_percentage": "100.00%",
|
||||
"project_wiki_repositories_verified_in_percentage": "100.00%",
|
||||
"repositories_count": 19,
|
||||
"wikis_count": 19,
|
||||
"replication_slots_count": null,
|
||||
"replication_slots_used_count": null,
|
||||
"healthy": false,
|
||||
|
|
@ -816,25 +788,15 @@ Example response:
|
|||
"repositories_replication_enabled": true,
|
||||
"repositories_synced_count": 18,
|
||||
"repositories_failed_count": 0,
|
||||
"wikis_synced_count": 18,
|
||||
"wikis_failed_count": 0,
|
||||
"repositories_verified_count": 0,
|
||||
"repositories_verification_failed_count": 0,
|
||||
"repositories_verification_total_count": 19,
|
||||
"wikis_verified_count": 0,
|
||||
"wikis_verification_failed_count": 0,
|
||||
"wikis_verification_total_count": 19,
|
||||
"job_artifacts_synced_missing_on_primary_count": null,
|
||||
"repositories_checksummed_count": null,
|
||||
"repositories_checksum_failed_count": null,
|
||||
"repositories_checksum_mismatch_count": 0,
|
||||
"repositories_checksum_total_count": null,
|
||||
"wikis_checksummed_count": null,
|
||||
"wikis_checksum_failed_count": null,
|
||||
"wikis_checksum_mismatch_count": 0,
|
||||
"wikis_checksum_total_count": null,
|
||||
"repositories_retrying_verification_count": 0,
|
||||
"wikis_retrying_verification_count": 0,
|
||||
"projects_count": 19,
|
||||
"container_repositories_replication_enabled": null,
|
||||
"design_repositories_replication_enabled": true,
|
||||
|
|
@ -999,9 +961,6 @@ Example response:
|
|||
"repositories_checksummed_in_percentage": "0.00%",
|
||||
"repositories_verified_in_percentage": "0.00%",
|
||||
"repositories_checked_in_percentage": "0.00%",
|
||||
"wikis_synced_in_percentage": "94.74%",
|
||||
"wikis_checksummed_in_percentage": "0.00%",
|
||||
"wikis_verified_in_percentage": "0.00%",
|
||||
"replication_slots_used_in_percentage": "0.00%",
|
||||
"design_repositories_synced_in_percentage": "0.00%",
|
||||
"lfs_objects_synced_in_percentage": "0.00%",
|
||||
|
|
@ -1035,7 +994,6 @@ Example response:
|
|||
"project_wiki_repositories_synced_in_percentage": "100.00%",
|
||||
"project_wiki_repositories_verified_in_percentage": "100.00%",
|
||||
"repositories_count": 19,
|
||||
"wikis_count": 19,
|
||||
"replication_slots_count": null,
|
||||
"replication_slots_used_count": null,
|
||||
"healthy": false,
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: reference, howto
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: reference, howto
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
remove_date: '2023-08-15'
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments"
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
type: reference
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: reference, howto
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
type: reference, howto
|
||||
stage: Manage
|
||||
stage: Govern
|
||||
group: Authentication and Authorization
|
||||
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||
---
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue