Internal Learning

Code Graph
vs. Service Topology

What this microservices customer was asking for, why it's different from what GKG does today, and what the gap actually is.

Based on the Apr 2026 customer conversation: 4,000+ services, Helm charts, Jenkins, API gateway.

Their Architecture

What this customer's system actually looks like

4,000+ services across three business layers. GKG sees every line of code in every repo โ€” but the connections between services live somewhere else entirely.

● GKG Indexed — Code Repos in GitLab
Presentation Layer
frontend-svc-A
GitLab repo · Java
✓ Indexed
frontend-svc-B
GitLab repo · Python
✓ Indexed
Business Layer
payment-service
GitLab repo · Java/Kotlin
✓ Indexed
order-service
GitLab repo · Java
✓ Indexed
notification-service
GitLab repo · Python
✓ Indexed
Integration Layer
integration-svc-A
GitLab repo · Kotlin
✓ Indexed
integration-svc-B
GitLab repo · Java
✓ Indexed
↓ how do these services connect? the answer lives below — invisible to GKG ↓
💡
The gap in one sentence: GKG can tell you everything about what is inside each service โ€” but the question "which services talk to payment-service?" lives in Helm YAML and Jenkins, not in the code.
The Core Problem

Monolith vs. microservices: dependencies move out of the code

In a monolith, service A calls service B through a code import. You can trace that. In microservices, service A calls service B over HTTP โ€” there is no import. The dependency information has to live somewhere, but it's no longer in the code.

Monolith / shared codebase Dependency is in the code

Service calls are code imports. GKG reads these directly. The graph is in the code itself.

// PaymentController.java
import com.example.order.OrderService;
import com.example.notify.NotificationService;

// GKG sees these imports.
// It knows: PaymentController
// depends on OrderService
// and NotificationService.

GKG traces these imports across repos, builds the graph, answers: "what would break if I change OrderService?"

Microservices architecture Dependency is invisible in code

Services communicate over HTTP/gRPC. Each service lives in its own repo. There is no import to read.

// PaymentService.java
// No imports of other services.
// The URL of order-service is set at
// deploy time via environment variable.

String orderUrl = System.getenv("ORDER_SERVICE_URL");
// Where does ORDER_SERVICE_URL come from?
// A Helm chart. Which lives in a
// separate repo. Which GKG can't read.

The dependency is encoded in a Helm chart values file in a different repo, in YAML format. GKG doesn't index YAML.

Where topology lives

Three places the service map actually lives

In a mature microservices system, the information "service A talks to service B" is encoded across three separate systems โ€” none of which are the application code.

๐Ÿ“„
Source 01
Helm Chart Values
YAML files that configure how a service is deployed in Kubernetes. Contains the URLs and credentials of every other service this one talks to.
Not indexed by GKG today

Each service has a corresponding Helm chart repo (e.g., helm_prod_payment). The values file lists every environment variable the service gets at runtime โ€” including the URLs of downstream services. This is the primary place service-to-service dependencies are declared.

# helm_prod_payment/values-prod.yaml
env:
  ORDER_SERVICE_URL: http://order-service:8080
  NOTIFY_SERVICE_URL: http://notification:8080
  MONGO_URI: mongodb://mongo:27017/payments
  API_GATEWAY_HOST: https://api.example.com

# This file = the inbound/outbound map for payment-service.
# GKG cannot read YAML. This is invisible to it.
โš™๏ธ
Source 02
CI/CD Pipeline Files
Jenkins Jenkinsfiles and pipeline configs that reference which Helm chart to use for each service โ€” another place the service-to-chart linkage is explicit.
Not indexed by GKG today

Jenkins pipelines reference Helm chart URLs explicitly. This creates an additional map: service repo โ†’ Helm chart repo. GKG only indexes GitLab CI/CD pipelines โ€” Jenkins is external and not ingested at all.

// Jenkinsfile for payment-service
pipeline {
  environment {
    HELM_CHART = 'helm_prod_payment'
    HELM_CHART_URL = 'https://charts.internal/payment'
    DOWNSTREAM = 'order-service,notification-service'
  }
  stages {
    stage('Deploy') {
      steps { helmDeploy(env.HELM_CHART) }
    }
  }
}
// GKG doesn't read Jenkins. This mapping is lost.
๐Ÿ”€
Source 03
API Gateway Config
Kong, NGINX, or AWS API Gateway routing rules that define which incoming requests go to which service. The authoritative source for the inbound traffic map.
Not indexed by GKG today

The API gateway is the single entry point for all external traffic. Its routing configuration is the ground truth for "what services exist and what paths they handle." This typically lives as YAML or JSON config โ€” sometimes in a separate repo, sometimes in Kubernetes ConfigMaps. Neither is indexed by GKG.

# kong-routes.yaml (API Gateway config)
services:
  - name: payment-service
    url: http://payment:8080
    routes:
      - paths: ["/api/v1/payments"]
  - name: order-service
    url: http://order:8080
    routes:
      - paths: ["/api/v1/orders"]
# This is the full inventory of services + their routes.
# Lives in YAML. GKG can't read it.
The Payment Service Example

Tracing one service through all four layers

This is the actual scenario from the customer call. The payment service has code in GitLab โ€” but its full dependency picture requires reading three other systems that GKG can't see today.

PAYMENT SERVICE ECOSYSTEM
GKG Vision Mode
GKG indexes this
GKG cannot read this
GKG Vision Mode: hidden from GKG
GKG can traverse this edge
GKG cannot traverse this edge
WALKTHROUGH โ€” click through to trace the dependency
Question from the customer
The customer's question: "Which services does payment-service communicate with, and is it using the right Helm chart?" Click Next to trace through how you'd answer this โ€” and where GKG helps vs. stops.
Step 0 of 6
GKG Today vs. This Account

Which questions GKG can actually answer for them

Honest breakdown. The customer's questions range from code-level (GKG can help) to topology-level (GKG is blind today).

Question
GKG Today
What GKG would need to answer it
"What services live in our payment domain group on GitLab?"
Yes
GKG indexes GitLab groups and projects. It can list all repos in a GitLab group right now.
"What languages and frameworks does payment-service use?"
Yes
GKG indexes code entities and language structure. Java, Kotlin, Python covered for this type of analysis.
"What code-level dependencies does payment-service have on shared libraries?"
Partial
GKG can trace code imports across repos โ€” if the shared library is also indexed. Works for code, not runtime HTTP calls.
"What other services does payment-service call at runtime?"
No
Runtime dependencies are in Helm values files (YAML). GKG doesn't index YAML. This is the core gap.
"Is payment-service linked to the correct Helm chart?"
No
The service-to-chart linkage is a naming convention enforced in Jenkins. GKG reads neither YAML nor Jenkins.
"Which services would be impacted if I change the payment API?"
No
Blast radius for HTTP APIs requires topology data. GKG can do code-level blast radius (which files import this function), not service-level.
"Show me all GitLab CI/CD pipelines that touch the payment domain."
Partial
GKG indexes GitLab CI/CD pipelines. But this customer runs Jenkins โ€” not GitLab CI. Jenkins pipelines are not indexed.
"Which of our 4,000 services shares a MongoDB instance with payment?"
No
MongoDB connection strings live in Helm chart values. YAML not indexed. Scale question (4K services) also unvalidated.
The Gap and the Path

What would need to be built to support this account

Prioritized by impact to this specific use case. P1 items are blockers โ€” without them, GKG gives partial value only.

P1
!

YAML / config file indexing

Helm charts are YAML. The entire service-to-service dependency map this customer cares about lives in YAML values files. Without YAML indexing, GKG is permanently blind to the topology layer. This is the single biggest product gap for infrastructure-heavy enterprise accounts.

Helm values.yaml K8s ConfigMaps API gateway config Affects all infra-heavy accounts
P1
!

Self-managed / on-prem availability

This customer is on-prem. GKG is not available for self-managed deployments until Q2 FY27. This is a hard blocker โ€” they can't trial any of GKG's capabilities regardless of what else is built. Every enterprise microservices customer we're talking to runs self-managed.

Q2 FY27 on roadmap Hard blocker for on-prem accounts
P2
~

Naming convention inference

The customer links services to Helm charts via naming convention: payment-service maps to helm_prod_payment. GKG today doesn't infer cross-repo relationships from naming patterns. Supporting this would mean letting customers define naming rules as explicit relationships in the graph โ€” or inferring them automatically.

Cross-repo relationship inference Custom naming pattern support
P2
~

External CI/CD import (Jenkins)

This customer runs Jenkins, not GitLab CI. GKG only indexes GitLab-native pipelines. Supporting Jenkins would require either a webhook integration (Jenkins pushes events to GKG) or a one-time import of Jenkinsfile metadata. The service-to-chart linkage encoded in Jenkinsfiles would become queryable.

Jenkins webhook or import Affects all non-GitLab CI shops
P3
+

Scale validation at 4,000+ services

The customer asked directly: "100K nodes โ€” can GKG handle that?" We don't have a benchmark answer. Before pitching to any hyperscaler or financial services account running thousands of services, we need a tested, citable performance number for query speed and graph traversal at that scale.

100K node benchmark needed Query traversal performance Required for enterprise confidence