Skip to content

Commit a02a4f1

Browse files
updates
1 parent c788447 commit a02a4f1

10 files changed

Lines changed: 76 additions & 11 deletions

File tree

app/interview-questions/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export const metadata: Metadata = {
4545
};
4646

4747
export default async function InterviewQuestionsPage() {
48-
const interviews = await getAllInterviews();
48+
const interviews = (await getAllInterviews()).filter((i) => !i.canonicalSlug);
4949

5050
return (
5151
<>

app/interviews/[slug]/page.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Metadata } from 'next';
22
import { notFound } from 'next/navigation';
33
import { getAllInterviewSlugs, getInterviewBySlug } from '@/lib/interviews';
4-
import { getCanonicalInterviewUrl } from '@/lib/interview-canonical';
4+
import { getInterviewCanonicalUrl } from '@/lib/interview-canonical';
55
import PostLayout from '@/components/PostLayout';
66
import ArticleStructuredData from '@/components/ArticleStructuredData';
77
import { defaultOgImage } from '@/lib/site-seo';
@@ -20,9 +20,12 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
2020
const interview = await getInterviewBySlug(slug);
2121
if (!interview) return {};
2222

23-
const canonical = getCanonicalInterviewUrl(interview.slug);
23+
const canonical = getInterviewCanonicalUrl(interview);
2424
const title = `${interview.title} | Proxy Tech Support`;
2525
const published = interview.date ? `${interview.date}T12:00:00.000Z` : undefined;
26+
const modifiedIso = interview.lastmod?.trim()
27+
? `${interview.lastmod.trim()}T12:00:00.000Z`
28+
: published;
2629

2730
return {
2831
title,
@@ -40,7 +43,7 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
4043
siteName: 'Proxy Tech Support',
4144
locale: 'en_US',
4245
publishedTime: published,
43-
modifiedTime: published,
46+
modifiedTime: modifiedIso ?? published,
4447
images: [defaultOgImage],
4548
},
4649
twitter: {
@@ -58,14 +61,15 @@ export default async function InterviewPostPage({ params }: Props) {
5861
if (!interview) notFound();
5962

6063
const Article = interview.Article;
61-
const url = getCanonicalInterviewUrl(interview.slug);
64+
const url = getInterviewCanonicalUrl(interview);
6265

6366
return (
6467
<>
6568
<ArticleStructuredData
6669
headline={interview.title}
6770
description={interview.description}
6871
datePublished={interview.date}
72+
dateModified={interview.lastmod?.trim()}
6973
url={url}
7074
type="Article"
7175
/>

app/sitemap.ts

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { MetadataRoute } from 'next';
22
import { getAllPosts } from '@/lib/posts';
33
import { getCanonicalUrlForPost } from '@/lib/post-canonical';
44
import { getAllInterviews } from '@/lib/interviews';
5-
import { getCanonicalInterviewUrl } from '@/lib/interview-canonical';
5+
import { getInterviewCanonicalUrl } from '@/lib/interview-canonical';
66
import { allLandingPages } from '@/data/landing-pages';
77

88
/** Required so `output: 'export'` can emit `/sitemap.xml` at build time. */
@@ -60,10 +60,26 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
6060
};
6161
});
6262

63-
const interviewRoutes: MetadataRoute.Sitemap = interviews.map((i) => ({
64-
url: getCanonicalInterviewUrl(i.slug),
65-
lastModified: today,
66-
}));
63+
/** Sitemap lastModified: `lastmod` when set, else publication `date`, else build date. */
64+
function interviewSitemapLastModified(i: (typeof interviews)[number]): string {
65+
const raw = i.lastmod?.trim() || i.date?.trim();
66+
if (!raw) return today;
67+
const d = new Date(`${raw}T12:00:00.000Z`);
68+
return Number.isNaN(d.getTime()) ? today : d.toISOString().split('T')[0];
69+
}
70+
71+
/** Alias + primary can share one canonical URL — keep the latest lastModified. */
72+
const interviewByCanonicalUrl = new Map<string, string>();
73+
for (const i of interviews) {
74+
const url = getInterviewCanonicalUrl(i);
75+
const lm = interviewSitemapLastModified(i);
76+
const prev = interviewByCanonicalUrl.get(url);
77+
if (!prev || lm > prev) interviewByCanonicalUrl.set(url, lm);
78+
}
79+
80+
const interviewRoutes: MetadataRoute.Sitemap = [...interviewByCanonicalUrl.entries()].map(
81+
([url, lastModified]) => ({ url, lastModified }),
82+
);
6783

6884
return [...staticRoutes, ...postRoutes, ...interviewRoutes];
6985
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { loadInterviewBodyHtml } from '@/lib/interview-body-html';
2+
3+
export default function Article() {
4+
const html = loadInterviewBodyHtml(
5+
'2026-04-10-cloud-operations-engineer-real-interview-questions-azure-aks-sql-gitops',
6+
);
7+
return <div dangerouslySetInnerHTML={{ __html: html }} />;
8+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/** Legacy indexed URL — canonical points to primary slug (2026-04-10). */
2+
export const meta = {
3+
slug: "2026-02-24-cloud-operations-engineer-real-interview-questions-azure-aks-sql-gitops",
4+
canonicalSlug: "2026-04-10-cloud-operations-engineer-real-interview-questions-azure-aks-sql-gitops",
5+
title:
6+
"Cloud Operations Engineer Real Interview Questions (Azure, AKS, Azure SQL, GitOps, Multi-Tenant) Asked in USA, UK, Canada & Australia",
7+
description:
8+
"Real Cloud Operations Engineer interview questions asked in production environments covering Azure, AKS, Azure SQL, incident management, multi-tenant architecture, performance troubleshooting, GitOps, monitoring, automation and customer success scenarios across USA, UK, Canada and Australia — with a concise 2026 addendum on GitOps evidence, cost signals on shared platforms, and AI governance in regulated reporting.",
9+
date: "2026-02-24",
10+
lastmod: "2026-05-15",
11+
keywords:
12+
"cloud operations engineer interview questions USA, Azure AKS interview real questions, multi tenant performance issue interview, Azure SQL troubleshooting interview, GitOps deployment interview questions, real cloud engineer interview UK Canada Australia",
13+
layout: "interview-post",
14+
} as const;

content/interview-articles/2026-04-10-cloud-operations-engineer-real-interview-questions-azure-aks-sql-gitops/body.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ <h2>12) Which Monitoring Systems Have You Worked On?</h2>
6363
<p>Tracked SLO and SLI metrics for reliability measurement.</p>
6464
<p>Configured structured alerting to reduce noise and improve early detection.</p>
6565
<hr>
66+
<h2>Update — themes interviewers still probe in 2026</h2>
67+
<p>Several hiring teams in the USA, UK, Canada, and Australia have recently stretched this style of round beyond the scenarios above. They increasingly ask how you would <strong>evidence</strong> change control in a GitOps-led AKS estate—who approves promotions, how rollbacks are rehearsed against realistic query shapes, and how you keep configuration drift visible without slowing delivery.</p>
68+
<p><strong>Cost and capacity on shared platforms</strong> also surface more often: tying Azure SQL tiering and AKS node pool sizing to tenant-level usage signals, and explaining how you negotiate trade-offs with finance and product when growth is uneven across customers.</p>
69+
<p>Finally, expect follow-ups that connect <strong>AI-assisted operations</strong> (monitoring and log investigation) to governance—data handling, audit trails, and when human sign-off remains mandatory in regulated or enterprise reporting environments.</p>
70+
<hr>
6671
<h1>Closing Thoughts</h1>
6772
<p>This interview round focused heavily on real production operations, multi-tenant architecture, performance troubleshooting, incident escalation, and platform ownership in Azure environments.</p>
6873
<p>These questions reflect how hiring managers evaluate operational maturity, collaboration skills, and decision-making under production pressure.</p>
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
export const meta = {
22
slug: "2026-04-10-cloud-operations-engineer-real-interview-questions-azure-aks-sql-gitops",
33
title: "Cloud Operations Engineer Real Interview Questions (Azure, AKS, Azure SQL, GitOps, Multi-Tenant) Asked in USA, UK, Canada & Australia",
4-
description: "Real Cloud Operations Engineer interview questions asked in production environments covering Azure, AKS, Azure SQL, incident management, multi-tenant architecture, performance troubleshooting, GitOps, monitoring, automation and customer success scenarios across USA, UK, Canada and Australia.",
4+
description: "Real Cloud Operations Engineer interview questions asked in production environments covering Azure, AKS, Azure SQL, incident management, multi-tenant architecture, performance troubleshooting, GitOps, monitoring, automation and customer success scenarios across USA, UK, Canada and Australia — with a concise 2026 addendum on GitOps evidence, cost signals on shared platforms, and AI governance in regulated reporting.",
55
date: "2026-04-10",
6+
lastmod: "2026-05-15",
67
keywords: "cloud operations engineer interview questions USA, Azure AKS interview real questions, multi tenant performance issue interview, Azure SQL troubleshooting interview, GitOps deployment interview questions, real cloud engineer interview UK Canada Australia",
78
layout: "interview-post",
89
} as const;

content/interview-articles/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import Article_2026_04_14_real_frontend_developer_interview_questions_react_type
1616
import { meta as meta_2026_04_14_real_frontend_developer_interview_questions_react_typescript_aws_cicd_microfrontend } from './2026-04-14-real-frontend-developer-interview-questions-react-typescript-aws-cicd-microfrontend/meta';
1717
import Article_2026_04_10_cloud_operations_engineer_real_interview_questions_azure_aks_sql_gitops from './2026-04-10-cloud-operations-engineer-real-interview-questions-azure-aks-sql-gitops/Article';
1818
import { meta as meta_2026_04_10_cloud_operations_engineer_real_interview_questions_azure_aks_sql_gitops } from './2026-04-10-cloud-operations-engineer-real-interview-questions-azure-aks-sql-gitops/meta';
19+
import Article_2026_02_24_cloud_operations_engineer_real_interview_questions_azure_aks_sql_gitops from './2026-02-24-cloud-operations-engineer-real-interview-questions-azure-aks-sql-gitops/Article';
20+
import { meta as meta_2026_02_24_cloud_operations_engineer_real_interview_questions_azure_aks_sql_gitops } from './2026-02-24-cloud-operations-engineer-real-interview-questions-azure-aks-sql-gitops/meta';
1921
import Article_2026_04_07_cloud_platforms_engineer_real_interview_questions_azure_m365_security_automation from './2026-04-07-cloud-platforms-engineer-real-interview-questions-azure-m365-security-automation/Article';
2022
import { meta as meta_2026_04_07_cloud_platforms_engineer_real_interview_questions_azure_m365_security_automation } from './2026-04-07-cloud-platforms-engineer-real-interview-questions-azure-m365-security-automation/meta';
2123
import Article_2026_04_03_real_enterprise_developer_interview_questions_kubernetes_aws_devops_security_usa_uk_canada_australia from './2026-04-03-real-enterprise-developer-interview-questions-kubernetes-aws-devops-security-usa-uk-canada-australia/Article';
@@ -32,6 +34,7 @@ export const interviewArticleEntries = [
3234
{ meta: meta_2026_04_20_real_sap_abap_interview_questions_otc_pricing_odata_btp, Article: Article_2026_04_20_real_sap_abap_interview_questions_otc_pricing_odata_btp },
3335
{ meta: meta_2026_04_14_real_frontend_developer_interview_questions_react_typescript_aws_cicd_microfrontend, Article: Article_2026_04_14_real_frontend_developer_interview_questions_react_typescript_aws_cicd_microfrontend },
3436
{ meta: meta_2026_04_10_cloud_operations_engineer_real_interview_questions_azure_aks_sql_gitops, Article: Article_2026_04_10_cloud_operations_engineer_real_interview_questions_azure_aks_sql_gitops },
37+
{ meta: meta_2026_02_24_cloud_operations_engineer_real_interview_questions_azure_aks_sql_gitops, Article: Article_2026_02_24_cloud_operations_engineer_real_interview_questions_azure_aks_sql_gitops },
3538
{ meta: meta_2026_04_07_cloud_platforms_engineer_real_interview_questions_azure_m365_security_automation, Article: Article_2026_04_07_cloud_platforms_engineer_real_interview_questions_azure_m365_security_automation },
3639
{ meta: meta_2026_04_03_real_enterprise_developer_interview_questions_kubernetes_aws_devops_security_usa_uk_canada_australia, Article: Article_2026_04_03_real_enterprise_developer_interview_questions_kubernetes_aws_devops_security_usa_uk_canada_australia },
3740
{ meta: meta_2026_04_01_real_enterprise_developer_interview_questions_dotnet_sql_angular_cloud, Article: Article_2026_04_01_real_enterprise_developer_interview_questions_dotnet_sql_angular_cloud },

lib/interview-canonical.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,11 @@ export function getCanonicalInterviewPath(slug: string): string {
88
export function getCanonicalInterviewUrl(slug: string): string {
99
return `${SITE}${getCanonicalInterviewPath(slug)}`;
1010
}
11+
12+
/** Public canonical URL for an interview (alias pages point at the primary slug). */
13+
export function getInterviewCanonicalUrl(interview: {
14+
slug: string;
15+
canonicalSlug?: string;
16+
}): string {
17+
return getCanonicalInterviewUrl(interview.canonicalSlug ?? interview.slug);
18+
}

lib/interviews.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ import { interviewArticleEntries } from '@/content/interview-articles';
33

44
export type InterviewData = {
55
slug: string;
6+
/** When set, SEO canonical + structured data use this slug’s URL (legacy alias). */
7+
canonicalSlug?: string;
8+
/** YYYY-MM-DD — sitemap lastmod + article modified signals; overrides `date` when newer. */
9+
lastmod?: string;
610
title: string;
711
description: string;
812
date: string;
@@ -17,6 +21,8 @@ let cached: InterviewData[] | null = null;
1721
function toInterviewData(): InterviewData[] {
1822
return interviewArticleEntries.map(({ meta, Article }) => ({
1923
slug: meta.slug,
24+
canonicalSlug: (meta as { canonicalSlug?: string }).canonicalSlug,
25+
lastmod: (meta as { lastmod?: string }).lastmod?.trim() || undefined,
2026
title: meta.title,
2127
description: meta.description,
2228
date: meta.date,

0 commit comments

Comments
 (0)