diff --git a/.github/workflows/pr-preview.yml b/.github/workflows/pr-preview.yml index babba09..19bd014 100644 --- a/.github/workflows/pr-preview.yml +++ b/.github/workflows/pr-preview.yml @@ -22,12 +22,12 @@ jobs: - name: Install dependencies run: npm ci - - name: Run tests - run: npm test - - name: Build site run: npm run build + - name: Run tests + run: npm test + - name: Comment PR uses: actions/github-script@v7 with: diff --git a/README.md b/README.md index 029937d..99f385c 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # OpenSearch - Observability Stack -[![CI](https://github.com/anirudha/opensearch-agentops-website/actions/workflows/ci.yml/badge.svg)](https://github.com/anirudha/opensearch-agentops-website/actions/workflows/ci.yml) -[![Deploy](https://github.com/anirudha/opensearch-agentops-website/actions/workflows/deploy.yml/badge.svg)](https://github.com/anirudha/opensearch-agentops-website/actions/workflows/deploy.yml) -[![codecov](https://codecov.io/gh/anirudha/opensearch-agentops-website/branch/main/graph/badge.svg)](https://codecov.io/gh/anirudha/opensearch-agentops-website) -[![GitHub Pages](https://img.shields.io/badge/GitHub%20Pages-Live-success?logo=github)](https://anirudha.github.io/opensearch-agentops-website/) +[![CI](https://github.com/opensearch-project/observability-stack/actions/workflows/ci.yml/badge.svg)](https://github.com/opensearch-project/observability-stack/actions/workflows/ci.yml) +[![Deploy](https://github.com/opensearch-project/observability-stack/actions/workflows/deploy.yml/badge.svg)](https://github.com/opensearch-project/observability-stack/actions/workflows/deploy.yml) +[![codecov](https://codecov.io/gh/opensearch-project/observability-stack/branch/main/graph/badge.svg)](https://codecov.io/gh/opensearch-project/observability-stack) +[![GitHub Pages](https://img.shields.io/badge/GitHub%20Pages-Live-success?logo=github)](https://opensearch-project.github.io/opensearch-agentops-website/) -**🌐 Live Site**: [https://anirudha.github.io/opensearch-agentops-website/](https://anirudha.github.io/opensearch-agentops-website/) +**🌐 Live Site**: [https://opensearch-project.github.io/opensearch-agentops-website/](https://opensearch-project.github.io/opensearch-agentops-website/) Marketing website and documentation for OpenSearch - Observability Stack - an OpenTelemetry-native observability platform for AI agents and LLM applications. diff --git a/STARLIGHT_INTEGRATION.md b/STARLIGHT_INTEGRATION.md index a6839b4..af5b198 100644 --- a/STARLIGHT_INTEGRATION.md +++ b/STARLIGHT_INTEGRATION.md @@ -49,9 +49,9 @@ Updated `README.md` with: ## URLs -- **Main Site**: https://anirudha.github.io/opensearch-agentops-website/ -- **Documentation**: https://anirudha.github.io/opensearch-agentops-website/docs/ -- **Getting Started**: https://anirudha.github.io/opensearch-agentops-website/getting-started/ +- **Main Site**: https://opensearch-project.github.io/opensearch-agentops-website/ +- **Documentation**: https://opensearch-project.github.io/opensearch-agentops-website/docs/ +- **Getting Started**: https://opensearch-project.github.io/opensearch-agentops-website/getting-started/ ## Local Development diff --git a/astro.config.mjs b/astro.config.mjs index ac1f276..8c2ce52 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -8,7 +8,7 @@ import react from '@astrojs/react'; // https://astro.build/config export default defineConfig({ - site: 'https://anirudha.github.io', + site: 'https://opensearch-project.github.io', base: '/opensearch-agentops-website', integrations: [sitemap(), react()], vite: { diff --git a/src/components/CTASection.astro b/src/components/CTASection.astro index 3f8e857..a97893c 100644 --- a/src/components/CTASection.astro +++ b/src/components/CTASection.astro @@ -18,27 +18,27 @@

Join thousands of AI teams building better applications with unified observability, - evaluation, and prompt management. Start free today. + traces, metrics, dashboards, and AI agent tracing. Get started today.

- Start Free Trial + Get Started - - + - Talk to Sales + View Docs
@@ -48,7 +48,7 @@ - 70% Cost Savings + Zero Lock-in
@@ -69,7 +69,7 @@ - SOC 2 & HIPAA Ready + OTel Native
diff --git a/src/components/CTASection.unit.test.ts b/src/components/CTASection.unit.test.ts index 16fa116..36cd2df 100644 --- a/src/components/CTASection.unit.test.ts +++ b/src/components/CTASection.unit.test.ts @@ -34,8 +34,8 @@ describe('CTASection Component - Unit Tests', () => { Ready to Transform Your AI Development?

- Join thousands of AI teams building better applications with unified observability, - evaluation, and prompt management. Start free today. + Join thousands of AI teams building better applications with unified observability, + traces, metrics, dashboards, and AI agent tracing. Get started today.

@@ -66,7 +66,7 @@ describe('CTASection Component - Unit Tests', () => { expect(subtext).toBeTruthy(); expect(subtext?.textContent).toContain('Join thousands of AI teams'); expect(subtext?.textContent).toContain('unified observability'); - expect(subtext?.textContent).toContain('Start free today'); + expect(subtext?.textContent).toContain('Get started today'); }); it('should have responsive headline sizing', () => { @@ -117,67 +117,67 @@ describe('CTASection Component - Unit Tests', () => { const ctaSectionHTML = `
- - Start Free Trial + Get Started - - Talk to Sales + View Docs
`; - + container.innerHTML = ctaSectionHTML; }); it('should render primary CTA button', () => { - const primaryCTA = container.querySelector('a[href="/signup"]'); + const primaryCTA = container.querySelector('a[href="https://github.com/opensearch-project/observability-stack"]'); expect(primaryCTA).toBeTruthy(); - expect(primaryCTA?.textContent?.trim()).toBe('Start Free Trial'); + expect(primaryCTA?.textContent?.trim()).toBe('Get Started'); }); it('should render secondary CTA button', () => { - const secondaryCTA = container.querySelector('a[href="/contact-sales"]'); + const secondaryCTA = container.querySelector('a[href="/opensearch-agentops-website/docs/"]'); expect(secondaryCTA).toBeTruthy(); - expect(secondaryCTA?.textContent?.trim()).toBe('Talk to Sales'); + expect(secondaryCTA?.textContent?.trim()).toBe('View Docs'); }); it('should have correct href on primary CTA', () => { - const primaryCTA = container.querySelector('a[href="/signup"]'); + const primaryCTA = container.querySelector('a[href="https://github.com/opensearch-project/observability-stack"]'); - expect(primaryCTA?.getAttribute('href')).toBe('/signup'); + expect(primaryCTA?.getAttribute('href')).toBe('https://github.com/opensearch-project/observability-stack'); }); it('should have correct href on secondary CTA', () => { - const secondaryCTA = container.querySelector('a[href="/contact-sales"]'); + const secondaryCTA = container.querySelector('a[href="/opensearch-agentops-website/docs/"]'); - expect(secondaryCTA?.getAttribute('href')).toBe('/contact-sales'); + expect(secondaryCTA?.getAttribute('href')).toBe('/opensearch-agentops-website/docs/'); }); it('should have analytics tracking on primary CTA', () => { - const primaryCTA = container.querySelector('a[href="/signup"]'); + const primaryCTA = container.querySelector('a[href="https://github.com/opensearch-project/observability-stack"]'); expect(primaryCTA?.getAttribute('data-analytics')).toBe('cta_final_start_trial'); }); it('should have analytics tracking on secondary CTA', () => { - const secondaryCTA = container.querySelector('a[href="/contact-sales"]'); + const secondaryCTA = container.querySelector('a[href="/opensearch-agentops-website/docs/"]'); - expect(secondaryCTA?.getAttribute('data-analytics')).toBe('cta_final_talk_sales'); + expect(secondaryCTA?.getAttribute('data-analytics')).toBe('cta_final_view_docs'); }); it('should have primary styling on primary CTA', () => { - const primaryCTA = container.querySelector('a[href="/signup"]'); + const primaryCTA = container.querySelector('a[href="https://github.com/opensearch-project/observability-stack"]'); expect(primaryCTA?.classList.contains('bg-white')).toBe(true); expect(primaryCTA?.classList.contains('hover:bg-slate-100')).toBe(true); @@ -186,7 +186,7 @@ describe('CTASection Component - Unit Tests', () => { }); it('should have secondary styling on secondary CTA', () => { - const secondaryCTA = container.querySelector('a[href="/contact-sales"]'); + const secondaryCTA = container.querySelector('a[href="/opensearch-agentops-website/docs/"]'); expect(secondaryCTA?.classList.contains('bg-white/10')).toBe(true); expect(secondaryCTA?.classList.contains('hover:bg-white/20')).toBe(true); @@ -216,8 +216,8 @@ describe('CTASection Component - Unit Tests', () => { }); it('should have correct padding on CTAs', () => { - const primaryCTA = container.querySelector('a[href="/signup"]'); - const secondaryCTA = container.querySelector('a[href="/contact-sales"]'); + const primaryCTA = container.querySelector('a[href="https://github.com/opensearch-project/observability-stack"]'); + const secondaryCTA = container.querySelector('a[href="/opensearch-agentops-website/docs/"]'); expect(primaryCTA?.classList.contains('px-8')).toBe(true); expect(primaryCTA?.classList.contains('py-4')).toBe(true); @@ -226,8 +226,8 @@ describe('CTASection Component - Unit Tests', () => { }); it('should have rounded corners on CTAs', () => { - const primaryCTA = container.querySelector('a[href="/signup"]'); - const secondaryCTA = container.querySelector('a[href="/contact-sales"]'); + const primaryCTA = container.querySelector('a[href="https://github.com/opensearch-project/observability-stack"]'); + const secondaryCTA = container.querySelector('a[href="/opensearch-agentops-website/docs/"]'); expect(primaryCTA?.classList.contains('rounded-lg')).toBe(true); expect(secondaryCTA?.classList.contains('rounded-lg')).toBe(true); @@ -247,7 +247,7 @@ describe('CTASection Component - Unit Tests', () => { - 70% Cost Savings + Zero Lock-in
@@ -268,7 +268,7 @@ describe('CTASection Component - Unit Tests', () => { - SOC 2 & HIPAA Ready + OTel Native
@@ -283,9 +283,9 @@ describe('CTASection Component - Unit Tests', () => { expect(badges.length).toBe(4); }); - it('should render "70% Cost Savings" badge', () => { + it('should render "Zero Lock-in" badge', () => { const badge = Array.from(container.querySelectorAll('span')).find( - span => span.textContent?.trim() === '70% Cost Savings' + span => span.textContent?.trim() === 'Zero Lock-in' ); expect(badge).toBeTruthy(); @@ -307,9 +307,9 @@ describe('CTASection Component - Unit Tests', () => { expect(badge).toBeTruthy(); }); - it('should render "SOC 2 & HIPAA Ready" badge', () => { + it('should render "OTel Native" badge', () => { const badge = Array.from(container.querySelectorAll('span')).find( - span => span.textContent?.trim() === 'SOC 2 & HIPAA Ready' + span => span.textContent?.trim() === 'OTel Native' ); expect(badge).toBeTruthy(); diff --git a/src/components/CyclingTagline.tsx b/src/components/CyclingTagline.tsx index 1dab946..8c678d1 100644 --- a/src/components/CyclingTagline.tsx +++ b/src/components/CyclingTagline.tsx @@ -6,17 +6,17 @@ const taglines = [ { label: 'Services', text: 'See every request, every dependency, every bottleneck', color: 'text-cyan-400' }, { label: 'Services', text: 'From microservices to monolithsβ€”full visibility', color: 'text-cyan-400' }, // Metrics (emerald) - { label: 'Metrics', text: 'Prometheus metrics, custom dashboards, SLO/SLI tracking', color: 'text-emerald-400' }, - { label: 'Metrics', text: 'Anomaly detection and forecasting built in', color: 'text-emerald-400' }, + { label: 'Metrics', text: 'Prometheus metrics, PromQL queries, and custom dashboards', color: 'text-emerald-400' }, + { label: 'Metrics', text: 'RED metrics computed automatically from trace data', color: 'text-emerald-400' }, { label: 'Metrics', text: 'Real-time dashboards for the signals that matter', color: 'text-emerald-400' }, // Logs (amber) { label: 'Logs', text: 'Correlate logs with tracesβ€”debug in minutes, not days', color: 'text-amber-400' }, - { label: 'Logs', text: 'Structured logging, search, and alerting at scale', color: 'text-amber-400' }, + { label: 'Logs', text: 'Full-text search with PPL structured queries', color: 'text-amber-400' }, { label: 'Logs', text: 'From ingestion to insight, all in one place', color: 'text-amber-400' }, // AI (orange) - { label: 'AI Agents', text: 'Agent tracing, local evals, and LLM observability', color: 'text-orange-400' }, + { label: 'AI Agents', text: 'Agent tracing with GenAI semantic conventions and MCP support', color: 'text-orange-400' }, { label: 'AI Agents', text: 'Your agents aren\'t black boxes anymore', color: 'text-orange-400' }, - { label: 'AI Agents', text: 'Evals, prompt management, and cost tracking for LLMs', color: 'text-orange-400' }, + { label: 'AI Agents', text: 'Trace graphs, token usage, and tool calls for every agent run', color: 'text-orange-400' }, ]; export function CyclingTagline() { diff --git a/src/components/Features.astro b/src/components/Features.astro index b7f0565..c7ad346 100644 --- a/src/components/Features.astro +++ b/src/components/Features.astro @@ -59,24 +59,24 @@ service: { id: 'metrics-dashboards', icon: 'zap', - title: 'Metrics, Dashboards & SLO/SLI', - description: 'Prometheus-compatible metrics ingestion with custom dashboards, SLO/SLI tracking, anomaly detection, and forecasting.', + title: 'Metrics & Dashboards', + description: 'Prometheus-compatible metrics with PromQL support. Custom dashboards and RED metrics computed automatically from trace data.', bullets: [ - 'Prometheus remote-write and PromQL support', - 'SLO/SLI definitions with burn-rate alerts', - 'Anomaly detection and time-series forecasting', + 'Prometheus remote-write and native PromQL support', + 'RED metrics (Rate, Errors, Duration) from Data Prepper', + 'Custom dashboards with real-time panels and charts', ], visualType: 'grid', visualContent: { items: [ - { title: 'Availability', progress: 99 }, - { title: 'Latency P99', progress: 95 }, - { title: 'Error Budget', progress: 82 }, + { title: 'Request Rate', progress: 99 }, + { title: 'P99 Latency', progress: 95 }, + { title: 'Error Rate', progress: 82 }, { title: 'Throughput', progress: 97 }, { title: 'Saturation', progress: 88 }, - { title: 'Anomaly Score', progress: 94 }, - { title: 'Forecast Acc.', progress: 91 }, - { title: 'Alert Precision', progress: 96 }, + { title: 'Availability', progress: 94 }, + { title: 'P50 Latency', progress: 91 }, + { title: 'Success Rate', progress: 96 }, ], }, imagePosition: 'left', @@ -85,11 +85,11 @@ service: id: 'logs', icon: 'file-text', title: 'Log Analytics & Correlation', - description: 'Ingest, search, and correlate logs with traces. Structured logging, pattern detection, and alerting at scale.', + description: 'Ingest, search, and correlate logs with traces. Full-text search with PPL and OpenTelemetry-native log collection.', bullets: [ 'Log-to-trace correlation in one click', - 'Full-text search with structured field queries', - 'Log-based alerting and anomaly detection', + 'Full-text search with PPL structured field queries', + 'OTel-native log ingestion via OTLP', ], visualType: 'mockup', visualContent: { @@ -101,11 +101,11 @@ service: id: 'ai-observability', icon: 'check-circle', title: 'AI Agent & LLM Observability', - description: 'Trace agent workflows, run local evals, track LLM costs, and manage prompts. Full observability for your AI stack.', + description: 'Trace AI agent workflows with OpenTelemetry GenAI semantic conventions. Visualize execution graphs, monitor token usage, and debug agent behavior.', bullets: [ - 'Agent tracing with tool-call and reasoning steps', - 'Local evaluation with LLM-as-Judge and custom scorers', - 'Prompt versioning, A/B testing, and cost tracking', + 'Agent tracing with tool-call and reasoning step visualization', + 'GenAI semantic conventions for standard, interoperable traces', + 'MCP support and Python/JavaScript SDKs', ], visualType: 'mockup', visualContent: { @@ -125,7 +125,7 @@ service: Full-Stack Observability, One Platform

- From service health to AI agent performance β€” traces, logs, metrics, dashboards, alerts, and more + From service health to AI agent performance β€” traces, logs, metrics, dashboards, and more

@@ -213,43 +213,42 @@ service: {feature.visualType === 'mockup' && feature.visualContent.type === 'prompt-card' && (
- +
-
Customer Support Prompt
-
Version 3.2 β€’ Production
+
Log Explorer
+
PPL Query
- Active + Live
- -
-
System Prompt
-

- You are a helpful customer support assistant. Be concise, friendly, and always verify information before providing answers... -

+ +
+ source = ss4o_logs-* | where severity = "ERROR" | sort - timestamp
- -
-
-
94%
-
Success Rate
-
-
-
1.2K
-
Uses Today
+ +
+
+ ERR +
+
Connection timeout to upstream service
+
trace_id: 3f2a...8c1d · service: api-gateway
+
-
-
$0.12
-
Avg Cost
+
+ WARN +
+
Retry attempt 2/3 for payment-service
+
trace_id: 7b4e...2f9a · service: checkout
+
@@ -277,60 +276,70 @@ service: {feature.visualType === 'mockup' && feature.visualContent.type === 'alert-card' && (
- -
-
-
- -
-
-
-

Cost Spike Detected

- 2 min ago + +
+
+
+
+
-

- GPT-4 usage increased 340% in the last hour. Consider switching to GPT-3.5 for non-critical requests. -

-
- - +
+
Agent Trace Waterfall
+
trace_id: 3f2a...8c1d
+ OK
-
- -
-
-
- + +
+
+ Agent +
+
+ invoke_agent (1240ms) +
-
-
-

Optimization Opportunity

- 15 min ago +
+ LLM +
+
+ chat (680ms)
-

- Your prompt for "summarization" could be 23% shorter without losing quality. Estimated savings: $420/month. -

-
- - +
+
+ Tool +
+
+ search_docs (320ms) +
+
+
+ LLM +
+
+ chat (240ms)
+ + +
+
+
5
+
Spans
+
+
+
1,847
+
Tokens
+
+
+
1.24s
+
Duration
+
+
)} diff --git a/src/components/Hero.astro b/src/components/Hero.astro index 60e3e94..51a7cb4 100644 --- a/src/components/Hero.astro +++ b/src/components/Hero.astro @@ -23,7 +23,7 @@ import { CyclingTagline } from './CyclingTagline';

- APM traces. Logs. Prometheus metrics. Service maps. Dashboards. Alerts. SLO/SLI. Anomaly detection. Forecasting. Plus agent tracing, local evals, and LLM observability. + APM traces. Logs. Prometheus metrics. Service maps. Dashboards. Plus agent tracing, MCP support, and AI observability SDKs.

One open-source platform. Full-stack observability. Zero lock-in. @@ -32,23 +32,23 @@ import { CyclingTagline } from './CyclingTagline';

@@ -145,14 +145,14 @@ import { CyclingTagline } from './CyclingTagline';
-
-
-
+
+
+
- +
-
Alerts
+
AI Agents
diff --git a/src/components/Hero.unit.test.ts b/src/components/Hero.unit.test.ts index fb24ab3..dc5b935 100644 --- a/src/components/Hero.unit.test.ts +++ b/src/components/Hero.unit.test.ts @@ -58,19 +58,18 @@ describe('Hero Component - Unit Tests', () => { it('should render subheadline text', () => { const heroHTML = `
-

- The unified platform for LLM evaluation, prompt management, and observability. - Everything you need to build production-ready AI applications. +

+ APM traces. Logs. Prometheus metrics. Service maps. Dashboards. Plus agent tracing, MCP support, and AI observability SDKs.

`; - + container.innerHTML = heroHTML; - const subheadline = container.querySelector('p.text-xl'); + const subheadline = container.querySelector('p.text-base'); expect(subheadline).toBeTruthy(); - expect(subheadline?.textContent).toContain('unified platform for LLM evaluation'); - expect(subheadline?.textContent).toContain('production-ready AI applications'); + expect(subheadline?.textContent).toContain('APM traces'); + expect(subheadline?.textContent).toContain('AI observability SDKs'); }); it('should render announcement badge with NEW indicator', () => { @@ -105,7 +104,7 @@ describe('Hero Component - Unit Tests', () => {
- 70% Cost Savings + Zero Lock-in
@@ -117,7 +116,7 @@ describe('Hero Component - Unit Tests', () => {
- SOC 2 & HIPAA Ready + OTel Native
@@ -132,9 +131,9 @@ describe('Hero Component - Unit Tests', () => { expect(badges.length).toBe(4); }); - it('should render "70% Cost Savings" badge', () => { + it('should render "Zero Lock-in" badge', () => { const badge = Array.from(container.querySelectorAll('span.text-sm')) - .find(el => el.textContent === '70% Cost Savings'); + .find(el => el.textContent === 'Zero Lock-in'); expect(badge).toBeTruthy(); expect(badge?.classList.contains('font-semibold')).toBe(true); @@ -159,9 +158,9 @@ describe('Hero Component - Unit Tests', () => { expect(badge?.classList.contains('text-white')).toBe(true); }); - it('should render "SOC 2 & HIPAA Ready" badge', () => { + it('should render "OTel Native" badge', () => { const badge = Array.from(container.querySelectorAll('span.text-sm')) - .find(el => el.textContent === 'SOC 2 & HIPAA Ready'); + .find(el => el.textContent === 'OTel Native'); expect(badge).toBeTruthy(); expect(badge?.classList.contains('font-semibold')).toBe(true); @@ -206,96 +205,81 @@ describe('Hero Component - Unit Tests', () => { const heroHTML = `
`; - + container.innerHTML = heroHTML; }); - it('should render "Start Free Trial" primary CTA', () => { - const cta = container.querySelector('a[href="/signup"]'); + it('should render "View Docs" primary CTA', () => { + const cta = container.querySelector('a[href="/opensearch-agentops-website/docs/"]'); expect(cta).toBeTruthy(); - expect(cta?.textContent?.trim()).toBe('Start Free Trial'); + expect(cta?.textContent?.trim()).toBe('View Docs'); }); it('should have correct href for primary CTA', () => { - const cta = container.querySelector('a[href="/signup"]'); + const cta = container.querySelector('a[href="/opensearch-agentops-website/docs/"]'); - expect(cta?.getAttribute('href')).toBe('/signup'); + expect(cta?.getAttribute('href')).toBe('/opensearch-agentops-website/docs/'); }); - it('should have primary styling on "Start Free Trial" button', () => { - const cta = container.querySelector('a[href="/signup"]'); + it('should have primary styling on "View Docs" button', () => { + const cta = container.querySelector('a[href="/opensearch-agentops-website/docs/"]'); - expect(cta?.classList.contains('bg-indigo-600')).toBe(true); - expect(cta?.classList.contains('hover:bg-indigo-700')).toBe(true); expect(cta?.classList.contains('text-white')).toBe(true); - expect(cta?.classList.contains('font-semibold')).toBe(true); + expect(cta?.classList.contains('font-bold')).toBe(true); }); - it('should render "Star on GitHub" secondary CTA', () => { - const cta = container.querySelector('a[href="https://github.com/opensearch-project/agentops"]'); + it('should render "GitHub" secondary CTA', () => { + const cta = container.querySelector('a[href="https://github.com/opensearch-project/observability-stack"]'); expect(cta).toBeTruthy(); - expect(cta?.textContent).toContain('Star on GitHub'); + expect(cta?.textContent).toContain('GitHub'); }); it('should have correct href for GitHub CTA', () => { - const cta = container.querySelector('a[href="https://github.com/opensearch-project/agentops"]'); + const cta = container.querySelector('a[href="https://github.com/opensearch-project/observability-stack"]'); - expect(cta?.getAttribute('href')).toBe('https://github.com/opensearch-project/agentops'); + expect(cta?.getAttribute('href')).toBe('https://github.com/opensearch-project/observability-stack'); }); it('should open GitHub link in new tab', () => { - const cta = container.querySelector('a[href="https://github.com/opensearch-project/agentops"]'); + const cta = container.querySelector('a[href="https://github.com/opensearch-project/observability-stack"]'); expect(cta?.getAttribute('target')).toBe('_blank'); expect(cta?.getAttribute('rel')).toBe('noopener noreferrer'); }); it('should have secondary styling on GitHub button', () => { - const cta = container.querySelector('a[href="https://github.com/opensearch-project/agentops"]'); + const cta = container.querySelector('a[href="https://github.com/opensearch-project/observability-stack"]'); - expect(cta?.classList.contains('bg-slate-800')).toBe(true); - expect(cta?.classList.contains('hover:bg-slate-700')).toBe(true); expect(cta?.classList.contains('text-white')).toBe(true); - }); - - it('should have GitHub icon in secondary CTA', () => { - const cta = container.querySelector('a[href="https://github.com/opensearch-project/agentops"]'); - const icon = cta?.querySelector('svg'); - - expect(icon).toBeTruthy(); - expect(icon?.classList.contains('w-5')).toBe(true); - expect(icon?.classList.contains('h-5')).toBe(true); + expect(cta?.classList.contains('font-semibold')).toBe(true); }); it('should have analytics tracking attributes on both CTAs', () => { - const primaryCTA = container.querySelector('a[href="/signup"]'); - const secondaryCTA = container.querySelector('a[href="https://github.com/opensearch-project/agentops"]'); + const primaryCTA = container.querySelector('a[href="/opensearch-agentops-website/docs/"]'); + const secondaryCTA = container.querySelector('a[href="https://github.com/opensearch-project/observability-stack"]'); - expect(primaryCTA?.getAttribute('data-analytics')).toBe('cta_hero_start_trial'); + expect(primaryCTA?.getAttribute('data-analytics')).toBe('cta_hero_view_docs'); expect(secondaryCTA?.getAttribute('data-analytics')).toBe('cta_hero_github'); }); diff --git a/src/components/Navigation.astro b/src/components/Navigation.astro index bb4bc07..5816a20 100644 --- a/src/components/Navigation.astro +++ b/src/components/Navigation.astro @@ -42,7 +42,7 @@ const navigationItems: NavItem[] = [