Skip to content
Closed

Dev #222

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
577f696
Add feedback widget and modal for user feedback submission (#193)
Monil-KTX Oct 2, 2025
5b186e4
Feat/integration of news letter and feedback menu (#194)
ktx-krupa Oct 3, 2025
fb34251
Feature/grafana plugin integration (#197)
ktx-krupa Oct 3, 2025
2ca2e8d
feat: integrate reCAPTCHA for newsletter subscription form (#198)
ktx-krupa Oct 3, 2025
cb8b219
update regex-pattern.md (#185)
DebashisBorgohainO2 Oct 6, 2025
be05bd6
Fix/resolve feedback menu related issue (#200)
Monil-KTX Oct 6, 2025
d1072a4
fix: enhance newsletter form with submit button and reset functionali…
Monil-KTX Oct 6, 2025
2f8f603
updated sensitive-data-redaction.md (#203)
DebashisBorgohainO2 Oct 7, 2025
32cc254
Update documentation under /management to reflect latest UI changes (…
DebashisBorgohainO2 Oct 8, 2025
a4b7e68
Fix/make theme related changes (#207)
Monil-KTX Oct 10, 2025
173cd03
fix: refactor header layout and improve mobile menu functionality (#208)
Monil-KTX Oct 10, 2025
10d7c3a
Fix/change width related css for md content (#209)
Monil-KTX Oct 10, 2025
bfdf0a5
update traces documentation (#210)
DebashisBorgohainO2 Oct 10, 2025
29e1853
update the index page under /traces
DebashisBorgohainO2 Oct 10, 2025
3771ac3
Revert "update the index page under /traces"
DebashisBorgohainO2 Oct 10, 2025
bb54a2e
Traces updates (#211)
DebashisBorgohainO2 Oct 10, 2025
d2e4779
fix: update secondary sidebar styles for consistent height and scroll…
Monil-KTX Oct 10, 2025
b9b91ad
fix: remove empty versions.json file (#214)
Monil-KTX Oct 13, 2025
b629bd2
Create federated search documentation (#216)
DebashisBorgohainO2 Oct 14, 2025
d88c5f2
fix: comment out version provider in mkdocs configuration
Monil-KTX Oct 13, 2025
daa6405
fix: add header-list-style class for consistent list styling in heade…
Monil-KTX Oct 15, 2025
c1cc949
fix: update header-list-style for consistent spacing in lists
Monil-KTX Oct 15, 2025
5868337
Merge branch 'dev' into fix/v3/make-css-related-changes-for-header-an…
Monil-KTX Oct 15, 2025
870d0f3
Merge pull request #220 from openobserve/fix/v3/make-css-related-chan…
ktx-abhishek Oct 15, 2025
e1ada76
Update deploy-docs-staging.yaml
ktx-abhishek Oct 15, 2025
d4c5a40
Merge pull request #221 from openobserve/fix/s3-sync
ktx-abhishek Oct 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/deploy-docs-staging.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ jobs:

- name: Deploy to S3
run: |
aws s3 sync ./site s3://openobserve-website-staging/docs --exclude=".git/*"
aws s3 sync ./site s3://openobserve-website-staging/docs --exclude=".git/*" --delete

- name: Invalidate CloudFront cache
run: |
aws cloudfront create-invalidation --distribution-id E2GZJM0TJIDFRM --paths "/docs/*"
aws cloudfront create-invalidation --distribution-id E2GZJM0TJIDFRM --paths "/docs/*"
3 changes: 3 additions & 0 deletions docs/assets/feedback.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/images/action-as-destination.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/add-regex-pattern.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/images/alert-email-destination.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/audit-trail.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/images/cipher-keys-akeyless.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/images/cipher-keys-encryption-mechanism.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/images/cipher-keys-o2local.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/cipher-keys-page.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/images/cipher-keys.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/config-custom-trace-id.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/config-traces-in-org-parameter.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/images/create-regex-pattern.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/current-cluster-query-result.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/current-cluster-query.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/detailed-span-view.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/drop-at-ingestion-time-result.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/drop-at-query-time-result.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/drop-at-query-time-test-config.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/images/email-regex.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/error-badge-spans.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/explore-logs-openobserve-plugin.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/federated-search-multi-select.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/federated-search-result.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/federated-search.png
Binary file modified docs/images/full-name-regex.png
Binary file added docs/images/navigate-to-traces.png
Binary file added docs/images/openobserve-data-source-config.png
Binary file added docs/images/openobserve-plugin.png
Binary file added docs/images/redact-at-ingestion-time-result.png
Binary file added docs/images/redact-at-query-test-config.png
Binary file added docs/images/redact-at-query-time-result.png
Binary file added docs/images/regex-pattern-execution-time.png
Binary file added docs/images/regex-patterns-drop.png
Binary file added docs/images/regex-patterns-redact.png
Binary file added docs/images/sensitive-data-redaction.png
Binary file added docs/images/service-map.png
Binary file added docs/images/span-details.png
Binary file added docs/images/span-view.png
Binary file modified docs/images/stream-settings-add-regex.png
Binary file added docs/images/stream-settings-sensitive-fields.png
Binary file added docs/images/timeline.png
Binary file added docs/images/trace-list.png
Binary file added docs/images/trace-timeline.png
Binary file added docs/images/traces-to-logs.png
Binary file added docs/images/traces.png
Binary file added docs/images/update-regex-patterns.png
Binary file added docs/images/view-trace-from-logs.png
Binary file added docs/images/warning-spans.png
Binary file added docs/images/webhook-template-for-alert.png
Binary file modified docs/images/webook-as-alert-destination.png
226 changes: 226 additions & 0 deletions docs/js/feedback.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,226 @@
// feedback.js

function feedbackModalInit() {
// Remove any previous event listeners by replacing the button and modal with clones
const oldBtn = document.querySelector("#feedbackButton");
const oldModal = document.querySelector("#feedbackModal");
if (oldBtn) {
const newBtn = oldBtn.cloneNode(true);
oldBtn.parentNode.replaceChild(newBtn, oldBtn);
}
if (oldModal) {
const newModal = oldModal.cloneNode(true);
oldModal.parentNode.replaceChild(newModal, oldModal);
}

// Now re-select after replacement
const feedbackButton = document.querySelector("#feedbackButton");
const modal = document.querySelector("#feedbackModal");

if (!feedbackButton || !modal) {
return;
}

const form = modal.querySelector("form");
const successView = modal.querySelector(".success-view");
const formView = modal.querySelector(".form-view");
const errorView = modal.querySelector(".error-view");
const tabs = modal.querySelectorAll(".feedback-tab");
let lastActiveElement = null;

// Ensure the form exists before touching it
if (!form) {
return;
}

// ensure there's an input[name=type] for the form (hidden) so the submit code can read it
let typeInput = form.querySelector("input[name=type]");
if (!typeInput) {
typeInput = document.createElement("input");
typeInput.type = "hidden";
typeInput.name = "type";
typeInput.value = "Issue";
form.appendChild(typeInput);
}

function openModal() {
lastActiveElement = document.activeElement;
modal.classList.remove("tw-hidden");
calculatePosition();
const ta = modal.querySelector("textarea");
if (ta) ta.focus();
}

function closeModal() {
modal.classList.add("tw-hidden");
form.reset();
errorView.classList.add("tw-hidden");
successView.classList.add("tw-hidden");
successView.classList.remove("tw-flex");
try {
modal.style.top = "";
modal.style.bottom = "";
} catch (e) {}
formView.classList.remove("tw-hidden");
try {
if (lastActiveElement && typeof lastActiveElement.focus === "function") {
lastActiveElement.focus();
}
} catch (e) {}
}

function calculatePosition() {
try {
const btnRect = feedbackButton.getBoundingClientRect();
const screenHeight = window.innerHeight;
const buttonCenter = btnRect.top + btnRect.height / 2;
const placeAbove = buttonCenter > screenHeight / 2;
modal.classList.remove(
"tw-top-full",
"tw-bottom-full",
"tw-mt-4",
"tw-mb-4"
);
if (placeAbove) {
modal.classList.add("tw-bottom-full", "tw-mb-4");
modal.style.bottom = "100%";
modal.style.top = "";
} else {
modal.classList.add("tw-top-full", "tw-mt-4");
modal.style.top = "100%";
modal.style.bottom = "";
}
if (!modal.classList.contains("tw-right-0"))
modal.classList.add("tw-right-0");
} catch (err) {}
}

if (tabs && tabs.length) {
const setActiveTab = (index) => {
tabs.forEach((tb, i) => {
const selected = i === index;
tb.classList.toggle("tw-bg-white", selected);
tb.classList.toggle("tw-text-gray-900", selected);
tb.classList.toggle("tw-shadow-sm", selected);
tb.setAttribute("aria-selected", selected ? "true" : "false");
if (selected) {
const type = tb.getAttribute("data-type") || tb.textContent.trim();
typeInput.value = type;
const ta = modal.querySelector("textarea");
if (ta) ta.placeholder = `Type your ${type.toLowerCase()} here...`;
}
});
};

tabs.forEach((t, idx) => {
t.addEventListener("click", () => {
setActiveTab(idx);
t.focus();
});

t.addEventListener("keydown", (ev) => {
const key = ev.key;
let newIndex = null;
if (key === "ArrowRight") newIndex = (idx + 1) % tabs.length;
else if (key === "ArrowLeft")
newIndex = (idx - 1 + tabs.length) % tabs.length;
else if (key === "Home") newIndex = 0;
else if (key === "End") newIndex = tabs.length - 1;

if (newIndex !== null) {
ev.preventDefault();
setActiveTab(newIndex);
tabs[newIndex].focus();
}
});
});

setActiveTab(0);
}

feedbackButton.addEventListener("click", () => {
try {
if (modal.classList.contains("tw-hidden")) {
openModal();
} else {
closeModal();
}
} catch (err) {}
});

document.addEventListener("keydown", (e) => {
if (e.key === "Escape") closeModal();
});

document.addEventListener("mousedown", (e) => {
if (!modal.contains(e.target) && !feedbackButton.contains(e.target)) {
closeModal();
}
});

window.addEventListener("resize", calculatePosition);

form.addEventListener("submit", (e) => {
e.preventDefault();
if (typeof form.reportValidity === "function") {
const ok = form.reportValidity();
if (!ok) {
return;
}
}
try {
errorView.classList.add("tw-hidden");
} catch (err) {}
const ta =
form.querySelector("textarea") || modal.querySelector("textarea");
const message = (ta && ta.value && ta.value.trim()) || "";
const data = {
type: (typeInput && typeInput.value) || "Issue",
message: message,
currentUrl: window.location.href,
userAgent: navigator.userAgent,
source: "feedback_form",
};
if (typeof window.trackFeedback === "function") {
try {
window.trackFeedback(data);
} catch (e) {}
}
formView.classList.add("tw-hidden");
successView.classList.add("tw-flex");
successView.classList.remove("tw-hidden");
setTimeout(closeModal, 1500);
fetch(
"https://script.google.com/macros/s/AKfycby5A7NSQCmG4KIBdM0HkRP-5zpRPy8aTrQHiQoe9uG_c_rv1VCiAnnZE8co7-kofgw-hg/exec",
{
method: "POST",
mode: "no-cors",
body: JSON.stringify(data),
headers: { "Content-Type": "application/json" },
}
).catch(() => {
try {
successView.classList.add("tw-hidden");
successView.classList.remove("tw-flex");
formView.classList.remove("tw-hidden");
if (errorView) {
errorView.textContent =
"Failed to submit feedback. Please try again.";
errorView.classList.remove("tw-hidden");
}
if (ta && typeof ta.focus === "function") ta.focus();
} catch (err) {}
});
});
}

// Run on DOMContentLoaded and MkDocs instant navigation
if (typeof window.document$ !== "undefined") {
window.document$.subscribe(() => {
setTimeout(feedbackModalInit, 0);
});
}
// Always run on DOMContentLoaded (for initial load)
document.addEventListener("DOMContentLoaded", () => {
setTimeout(feedbackModalInit, 0);
});
2 changes: 0 additions & 2 deletions docs/js/search-tracking.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,7 @@
// pageType, // docs / blog / marketing (uncomment if needed)
...payload,
}),
});
});

} catch (error) {
console.warn("Analytics API error:", error);
}
Expand Down
39 changes: 39 additions & 0 deletions docs/js/segment.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
function getAnonymousId() {
let anonId = localStorage.getItem("segment_anonymous_id");
if (!anonId) {
anonId =
"anon_" + Math.random().toString(36).substr(2, 9) + "_" + Date.now();
localStorage.setItem("segment_anonymous_id", anonId);
}
return anonId;
}

function getSegmentProxyUrl() {
// Set your Segment proxy URL here or from a global variable
return "https://swisspipe.dev.zinclabs.dev/api/v1/4e5cac41-4d34-46f9-b862-e7ac551b5a8f/trigger"; // e.g., set in your template
}

function trackFeedback(feedbackData) {
const proxyUrl = getSegmentProxyUrl();
if (!proxyUrl) {
return;
}
const message = {
user: { anonymousId: getAnonymousId() },
event: "O2 Website Docs Feedback",
properties: feedbackData,
timestamp: new Date().toISOString(),
type: "track",
};
fetch(proxyUrl, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(message),
})
.then((res) => {
return res.text().then((text) => {});
})
.catch((e) => {});
}

window.trackFeedback = trackFeedback;
106 changes: 106 additions & 0 deletions docs/js/theme.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
// Simple theme persistence - leverages MkDocs Material's built-in theme system
(function () {
// Apply saved theme immediately to prevent flash
function applySavedTheme() {
const savedScheme = localStorage.getItem("theme-preference");
if (savedScheme) {
document.documentElement.setAttribute(
"data-md-color-scheme",
savedScheme
);
// Set the correct radio button as checked
var paletteForm = document.querySelector(
'form[data-md-component="palette"]'
);
if (paletteForm) {
var inputs = paletteForm.querySelectorAll('input[name="__palette"]');
inputs.forEach(function (input) {
if (input.getAttribute("data-md-color-scheme") === savedScheme) {
input.checked = true;
} else {
input.checked = false;
}
});
}
}
}

// Save theme preference when changed
function attachPaletteListeners() {
var paletteForm = document.querySelector(
'form[data-md-component="palette"]'
);
if (!paletteForm) return false;
// avoid attaching twice to the same form
if (paletteForm.getAttribute("data-theme-listeners") === "1") return true;
var inputs = paletteForm.querySelectorAll('input[name="__palette"]');
inputs.forEach(function (input) {
input.addEventListener("change", function () {
if (this.checked) {
var scheme = this.getAttribute("data-md-color-scheme");
document.documentElement.setAttribute("data-md-color-scheme", scheme);
localStorage.setItem("theme-preference", scheme);
}
});
});
paletteForm.setAttribute("data-theme-listeners", "1");
return true;
}

// Observe changes to the documentElement attribute for scheme changes
function observeSchemeAttribute() {
const observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
if (mutation.attributeName === "data-md-color-scheme") {
const scheme = document.documentElement.getAttribute(
"data-md-color-scheme"
);
if (scheme) {
localStorage.setItem("theme-preference", scheme);
}
}
});
});
observer.observe(document.documentElement, {
attributes: true,
attributeFilter: ["data-md-color-scheme"],
});
}

// Watch the body for insertions/replacements of the palette form and re-attach listeners
function observeBodyForPalette() {
// Try attach immediately in case it's already present
attachPaletteListeners();

const bodyObserver = new MutationObserver(function (mutations) {
// If nodes are added/removed we attempt to (re)attach listeners
for (var i = 0; i < mutations.length; i++) {
var mutation = mutations[i];
if (
mutation.type === "childList" &&
(mutation.addedNodes.length || mutation.removedNodes.length)
) {
// small debounce: try attach; attachPaletteListeners is idempotent
attachPaletteListeners();
}
}
});
bodyObserver.observe(document.body || document.documentElement, {
childList: true,
subtree: true,
});
}

// Setup theme persistence (apply + observe)
function setupThemePersistence() {
applySavedTheme();
observeSchemeAttribute();
observeBodyForPalette();
}

// Initial setup
setupThemePersistence();

// Re-apply on every DOMContentLoaded (instant navigation)
document.addEventListener("DOMContentLoaded", setupThemePersistence);
})();
Loading
Loading