From 0cda2dd742c0ae7c2009a18801970e0d352e8abc Mon Sep 17 00:00:00 2001
From: Aleksandr Muravja <aleks.muravja@gmail.com>
Date: Mon, 14 Apr 2025 10:51:26 +0200
Subject: [PATCH 01/11] Relabel

---
 app/handlers.go | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/app/handlers.go b/app/handlers.go
index c020255..e1e7951 100644
--- a/app/handlers.go
+++ b/app/handlers.go
@@ -87,7 +87,13 @@ func (h *Handler) ScrapeTargets(w http.ResponseWriter, req *http.Request) {
 			"id":  t.ID,
 		}
 		for i, tag := range t.Tags {
-			labels[fmt.Sprintf("tag_%d", i)] = tag
+			parts := strings.SplitN(tag, ":", 2)
+			if len(parts) < 2 {
+				labels[fmt.Sprintf("tag_%d", i)] = tag
+				continue
+			}
+			labels[parts[0]] = parts[1]
+
 		}
 		result = append(result, map[string]any{
 			"targets": []string{fmt.Sprintf("%s:%d", t.Address, t.Port)},
-- 
GitLab


From b2bb8ae30da5994df76480994beae883648604f4 Mon Sep 17 00:00:00 2001
From: Aleksandr Muravja <aleks.muravja@gmail.com>
Date: Mon, 14 Apr 2025 11:17:42 +0200
Subject: [PATCH 02/11] Test

---
 app/handlers.go | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/handlers.go b/app/handlers.go
index e1e7951..69c86fb 100644
--- a/app/handlers.go
+++ b/app/handlers.go
@@ -93,7 +93,6 @@ func (h *Handler) ScrapeTargets(w http.ResponseWriter, req *http.Request) {
 				continue
 			}
 			labels[parts[0]] = parts[1]
-
 		}
 		result = append(result, map[string]any{
 			"targets": []string{fmt.Sprintf("%s:%d", t.Address, t.Port)},
-- 
GitLab


From 80fd5c02d5cf1e7601f9aa115bddc5b5c4866465 Mon Sep 17 00:00:00 2001
From: Aleksandr Muravja <aleks.muravja@gmail.com>
Date: Mon, 14 Apr 2025 11:30:19 +0200
Subject: [PATCH 03/11] Added debug symbols

---
 app/handlers.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/handlers.go b/app/handlers.go
index 69c86fb..944cfe9 100644
--- a/app/handlers.go
+++ b/app/handlers.go
@@ -88,6 +88,7 @@ func (h *Handler) ScrapeTargets(w http.ResponseWriter, req *http.Request) {
 		}
 		for i, tag := range t.Tags {
 			parts := strings.SplitN(tag, ":", 2)
+			log.Printf("Parts %v", parts)
 			if len(parts) < 2 {
 				labels[fmt.Sprintf("tag_%d", i)] = tag
 				continue
-- 
GitLab


From 3f6a37af77b0c018bb6f217e9fa39400e1aad605 Mon Sep 17 00:00:00 2001
From: Aleksandr Muravja <aleks.muravja@gmail.com>
Date: Mon, 14 Apr 2025 12:09:01 +0200
Subject: [PATCH 04/11] Added version

---
 cmd/main.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cmd/main.go b/cmd/main.go
index 8dd3aa4..0654e67 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -54,6 +54,6 @@ func main() {
 	if port == "" {
 		port = "8080"
 	}
-	app.LogJSON("info", "server started", map[string]any{"port": port})
+	app.LogJSON("info", "server started (version 0.4)", map[string]any{"port": port})
 	log.Fatal(http.ListenAndServe(":"+port, nil))
 }
-- 
GitLab


From 1f4386e34d8a17fa39a95ca55469c517f8252cf3 Mon Sep 17 00:00:00 2001
From: Aleksandr Muravja <aleks.muravja@gmail.com>
Date: Mon, 14 Apr 2025 12:18:31 +0200
Subject: [PATCH 05/11] Removed debug Symbols

---
 app/handlers.go | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/handlers.go b/app/handlers.go
index 944cfe9..69c86fb 100644
--- a/app/handlers.go
+++ b/app/handlers.go
@@ -88,7 +88,6 @@ func (h *Handler) ScrapeTargets(w http.ResponseWriter, req *http.Request) {
 		}
 		for i, tag := range t.Tags {
 			parts := strings.SplitN(tag, ":", 2)
-			log.Printf("Parts %v", parts)
 			if len(parts) < 2 {
 				labels[fmt.Sprintf("tag_%d", i)] = tag
 				continue
-- 
GitLab


From 9c838ddca2509c3dd7e025e4aee7b54751fc06df Mon Sep 17 00:00:00 2001
From: Aleksandr Muravja <aleks.muravja@gmail.com>
Date: Mon, 14 Apr 2025 12:35:13 +0200
Subject: [PATCH 06/11] Using tag map instead

---
 app/handlers.go                |  9 ++-------
 app/model.go                   | 10 +++++-----
 app/templates/pages/index.html |  7 +++++--
 3 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/app/handlers.go b/app/handlers.go
index 69c86fb..89b7051 100644
--- a/app/handlers.go
+++ b/app/handlers.go
@@ -86,13 +86,8 @@ func (h *Handler) ScrapeTargets(w http.ResponseWriter, req *http.Request) {
 			"job": job,
 			"id":  t.ID,
 		}
-		for i, tag := range t.Tags {
-			parts := strings.SplitN(tag, ":", 2)
-			if len(parts) < 2 {
-				labels[fmt.Sprintf("tag_%d", i)] = tag
-				continue
-			}
-			labels[parts[0]] = parts[1]
+		for key, value := range t.Labels {
+			labels[key] = value
 		}
 		result = append(result, map[string]any{
 			"targets": []string{fmt.Sprintf("%s:%d", t.Address, t.Port)},
diff --git a/app/model.go b/app/model.go
index faef4c8..a35d83f 100644
--- a/app/model.go
+++ b/app/model.go
@@ -1,11 +1,11 @@
 package app
 
-// Target defines a single service instance with unique ID and tags
+// Target defines a single service instance with unique ID and labels
 type Target struct {
-	ID      string   `json:"ID"`
-	Address string   `json:"Address"`
-	Port    int      `json:"Port"`
-	Tags    []string `json:"Tags,omitempty"`
+	ID      string            `json:"ID"`
+	Address string            `json:"Address"`
+	Port    int               `json:"Port"`
+	Labels  map[string]string `json:"Labels,omitempty"`
 }
 
 // JobGroup maps a job name to a slice of targets
diff --git a/app/templates/pages/index.html b/app/templates/pages/index.html
index dae475a..eb44d1b 100644
--- a/app/templates/pages/index.html
+++ b/app/templates/pages/index.html
@@ -22,10 +22,13 @@
   -d '{
     "Job": "node-exporter",
     "Target": {
-      "ID": "node1",
+      "ID": "server1",
       "Address": "10.0.0.1",
       "Port": 9100,
-      "Tags": ["linux"]
+      "Labels": {
+        "server": "server1",
+        "host": "node1"
+      }
     }
 }'</code></pre>
 {{end}}
-- 
GitLab


From 50906ada3acf9936037caaf3f3b091a71ba08f0a Mon Sep 17 00:00:00 2001
From: Aleksandr Muravja <aleks.muravja@gmail.com>
Date: Mon, 14 Apr 2025 12:36:50 +0200
Subject: [PATCH 07/11] Service changed as well

---
 app/templates/pages/service.html | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/templates/pages/service.html b/app/templates/pages/service.html
index b3d298e..d62cdc7 100644
--- a/app/templates/pages/service.html
+++ b/app/templates/pages/service.html
@@ -21,12 +21,12 @@
           <td>{{ .Address }}</td>
           <td>{{ .Port }}</td>
           <td>
-            {{- if .Tags -}}
-              {{- range $i, $t := .Tags -}}
-                {{ if $i }}, {{ end }}<span class="badge bg-secondary">{{ $t }}</span>
+            {{- if .Labels -}}
+              {{- range $i, $l := .Labels -}}
+                {{ if $i }}, {{ end }}<span class="badge bg-secondary">{{ $l }}</span>
               {{- end -}}
             {{ else }}
-              <span class="text-muted">-</span>
+              <span class="text-muted">No labels available</span>
             {{ end }}
           </td>
         </tr>
-- 
GitLab


From a3f78a393e40397d0ffa484febbf0006a7022ec7 Mon Sep 17 00:00:00 2001
From: Aleksandr Muravja <aleks.muravja@gmail.com>
Date: Mon, 14 Apr 2025 12:59:25 +0200
Subject: [PATCH 08/11] Service Tags

---
 app/templates/pages/service.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/templates/pages/service.html b/app/templates/pages/service.html
index d62cdc7..a0a4251 100644
--- a/app/templates/pages/service.html
+++ b/app/templates/pages/service.html
@@ -23,7 +23,7 @@
           <td>
             {{- if .Labels -}}
               {{- range $i, $l := .Labels -}}
-                {{ if $i }}, {{ end }}<span class="badge bg-secondary">{{ $l }}</span>
+                <span class="badge">{{ $i }}:{{ $l }}</span>&nbsp;
               {{- end -}}
             {{ else }}
               <span class="text-muted">No labels available</span>
-- 
GitLab


From e8a524ee8958f8c62d11610b1af6fcde4dd87bf6 Mon Sep 17 00:00:00 2001
From: Aleksandr Muravja <aleks.muravja@gmail.com>
Date: Mon, 14 Apr 2025 13:13:27 +0200
Subject: [PATCH 09/11] More Services

---
 app/templates/pages/service.html | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/app/templates/pages/service.html b/app/templates/pages/service.html
index a0a4251..58c7baf 100644
--- a/app/templates/pages/service.html
+++ b/app/templates/pages/service.html
@@ -4,6 +4,22 @@
 
 {{ if not .Targets }}
   <div class="alert alert-warning">No targets registered for this job.</div>
+  <h2 class="mt-5">Register curl</h2>
+  <pre><code>curl -X POST http://localhost:8080/api/v1/service/register \
+    -H "Authorization: Bearer &lt;token&gt;" \
+    -H "Content-Type: application/json" \
+    -d '{
+      "Job": "node-exporter",
+      "Target": {
+        "ID": "server1",
+        "Address": "10.0.0.1",
+        "Port": 9100,
+        "Labels": {
+          "server": "server1",
+          "host": "node1"
+        }
+      }
+  }'</code></pre>
 {{ else }}
   <table class="table table-striped">
     <thead>
-- 
GitLab


From d80cb5b1ee8a98db39067df2c5e93cf6f65bb969 Mon Sep 17 00:00:00 2001
From: Aleksandr Muravja <aleks.muravja@gmail.com>
Date: Mon, 14 Apr 2025 15:03:47 +0200
Subject: [PATCH 10/11] Raw view

---
 app/templates/pages/service.html | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/app/templates/pages/service.html b/app/templates/pages/service.html
index 58c7baf..0949732 100644
--- a/app/templates/pages/service.html
+++ b/app/templates/pages/service.html
@@ -1,6 +1,7 @@
 {{ template "base" .}}
 {{ define "content" }}
 <h1 class="mb-4">Service: {{ .Job }}</h1>
+Raw view is: <a href="/api/v1/sd/{{ .Job }}"> here</a><br>
 
 {{ if not .Targets }}
   <div class="alert alert-warning">No targets registered for this job.</div>
@@ -49,9 +50,11 @@
       {{ end }}
     </tbody>
   </table>
+  <h2 class="mt-5">Deregister curl</h2>
+  <pre><code>curl -X POST http://localhost:8080/api/v1/service/deregister/{{ .Job }}/&lt;target_id&gt; \
+    -H "Authorization: Bearer &lt;token&gt;"</code>
+  </pre>
 {{ end }}
 
-<h2 class="mt-5">Deregister curl</h2>
-<pre><code>curl -X POST http://localhost:8080/api/v1/service/deregister/{{ .Job }}/&lt;target_id&gt; \
-  -H "Authorization: Bearer &lt;token&gt;"</code></pre>
+
 {{ end }}
-- 
GitLab


From 940a450a916910c6d451ecad26b29dcb7d5651d7 Mon Sep 17 00:00:00 2001
From: Aleksandr Muravja <aleks.muravja@gmail.com>
Date: Mon, 14 Apr 2025 15:32:00 +0200
Subject: [PATCH 11/11] Updated README

---
 README.md | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 5441292..889b0bb 100644
--- a/README.md
+++ b/README.md
@@ -25,6 +25,7 @@ It supports dynamic target registration with per-target tags, JSON API, and a Bo
 | `POST` | `/api/v1/service/deregister/{job}/{id}` | Deregister target |
 | `GET` | `/api/v1/service/{job}` | List targets for job |
 | `GET` | `/api/v1/services` | List all jobs |
+| `GET` | `/api/v1/sd/{job}` | List all jobs in raw json |
 
 ---
 
@@ -71,7 +72,10 @@ Stored under `data/` as `<job>.json`:
     "ID": "node1",
     "Address": "10.0.0.1",
     "Port": 9100,
-    "Tags": ["linux"]
+    "Labels": {
+      "server": "node1", 
+      "host": "host1"
+    }
   }
 ]
 ```
-- 
GitLab