Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2023-09-01 15:09:54 +00:00
parent 02f6aecd47
commit e1faff6544
165 changed files with 233 additions and 2730 deletions

View File

@ -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'

View File

@ -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'

View File

@ -1 +1 @@
56ab62b8e3cf853560e2417fe239219c51f0b228
3c844703332ab78c394328a9eb0250aac4e9eb93

View File

@ -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"

View File

@ -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);

View File

@ -1,4 +0,0 @@
import { initSimpleApp } from '~/helpers/init_simple_app_helper';
import ListIndex from '~/tracing/list_index.vue';
initSimpleApp('#js-tracing', ListIndex);

View File

@ -1,4 +0,0 @@
import { initSimpleApp } from '~/helpers/init_simple_app_helper';
import DetailsIndex from '~/tracing/details_index.vue';
initSimpleApp('#js-tracing-details', DetailsIndex);

View File

@ -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"

View File

@ -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;
}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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,
};
}

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1,4 +0,0 @@
- page_title _('Tracing')
#js-tracing{ data: { view_model: observability_tracing_view_model(@project) } }

View File

@ -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) } }

View File

@ -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'

View File

@ -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'

View File

@ -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

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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

View File

@ -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
---

View File

@ -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

View File

@ -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
---

View File

@ -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)

View File

@ -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.

View File

@ -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

View File

@ -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` |

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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"
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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%",

View File

@ -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,

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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'

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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"
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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

View File

@ -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
---

View File

@ -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
---

View File

@ -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
---

View File

@ -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

View File

@ -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
---

View File

@ -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