You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: prom_exporter.go
    path of file: ./repos/chat/monitoring/exporter
    
    the code of the file until where you have to start completion: package main

import (
	"log"
	"time"

	"github.com/prometheus/client_golang/prometheus"
)

// PromExporter collects metrics in Prometheus format from a Tinode server.
type PromExporter struct {
	address   string
	timeout   time.Duration
	namespace string

	scraper *Scraper

	up            *prometheus.Desc
	version       *prometheus.Desc
	topicsLive    *prometheus.Desc
	topicsTotal   *prometheus.Desc
	sessionsLive  *prometheus.Desc
	sessionsTotal *prometheus.Desc

	numGoroutines *prometheus.Desc

	incomingMessagesWebsockTotal *prometheus.Desc
	outgoingMessagesWebsockTotal *prometheus.Desc

	incomingMessagesLongpollTotal *prometheus.Desc
	outgoingMessagesLongpollTotal *prometheus.Desc

	incomingMessagesGrpcTotal *prometheus.Desc
	outgoingMessagesGrpcTotal *prometheus.Desc

	fileDownloadsTotal *prometheus.Desc
	fileUploadsTotal   *prometheus.Desc

	ctrlCodesTotal2xx *prometheus.Desc
	ctrlCodesTotal3xx *prometheus.Desc
	ctrlCodesTotal4xx *prometheus.Desc
	ctrlCodesTotal5xx *prometheus.Desc

	clusterLeader             *prometheus.Desc
	clusterSize               *prometheus.Desc
	clusterNodesLive          *prometheus.Desc
	malloced                  *prometheus.Desc
	requestLatencyMsCount     *prometheus.Desc
	outgoingMessageBytesCount *prometheus.Desc
}

// NewPromExporter returns an initialized Prometheus exporter.
func NewPromExporter(server, namespace string, timeout time.Duration, scraper *Scraper) *PromExporter {
	return &PromExporter{
		address:   server,
		timeout:   timeout,
		namespace: namespace,
		scraper:   scraper,
		up: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "up"),
			"If tinode instance is reachable.",
			nil,
			nil,
		),
		version: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "version"),
			"The version of this tinode instance.",
			nil,
			nil,
		),
		topicsLive: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "topics_live_count"),
			"Number of currently active topics.",
			nil,
			nil,
		),
		topicsTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "topics_total"),
			"Total number of topics used during instance lifetime.",
			nil,
			nil,
		),
		sessionsLive: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "sessions_live_count"),
			"Number of currently active sessions.",
			nil,
			nil,
		),
		sessionsTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "sessions_total"),
			"Total number of sessions since instance start.",
			nil,
			nil,
		),
		numGoroutines: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "num_goroutines"),
			"Number of currently spawned goroutines.",
			nil,
			nil,
		),
		incomingMessagesWebsockTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "incoming_messages_websock_total"),
			"Total number of incoming messages via websocket.",
			nil,
			nil,
		),
		outgoingMessagesWebsockTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "outgoing_messages_websock_total"),
			"Total number of outgoiing messages via websocket.",
			nil,
			nil,
		),
		incomingMessagesLongpol
    
func NewPromExporter(server, namespace string, timeout time.Duration, scraper *Scraper) *PromExporter {
	return &PromExporter{
		address:   server,
		timeout:   timeout,
		namespace: namespace,
		scraper:   scraper,
		up: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "up"),
			"If tinode instance is reachable.",
			nil,
			nil,
		),
		version: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "version"),
			"The version of this tinode instance.",
			nil,
			nil,
		),
		topicsLive: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "topics_live_count"),
			"Number of currently active topics.",
			nil,
			nil,
		),
		topicsTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "topics_total"),
			"Total number of topics used during instance lifetime.",
			nil,
			nil,
		),
		sessionsLive: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "sessions_live_count"),
			"Number of currently active sessions.",
			nil,
			nil,
		),
		sessionsTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "sessions_total"),
			"Total number of sessions since instance start.",
			nil,
			nil,
		),
		numGoroutines: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "num_goroutines"),
			"Number of currently spawned goroutines.",
			nil,
			nil,
		),
		incomingMessagesWebsockTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "incoming_messages_websock_total"),
			"Total number of incoming messages via websocket.",
			nil,
			nil,
		),
		outgoingMessagesWebsockTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "outgoing_messages_websock_total"),
			"Total number of outgoiing messages via websocket.",
			nil,
			nil,
		),
		incomingMessagesLongpollTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "incoming_messages_longpoll_total"),
			"Total number of incoming messages via longpoll.",
			nil,
			nil,
		),
		outgoingMessagesLongpollTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "outgoing_messages_longpoll_total"),
			"Total number of outgoiing messages via longpoll.",
			nil,
			nil,
		),
		incomingMessagesGrpcTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "incoming_messages_grpc_total"),
			"Total number of incoming messages via grpc.",
			nil,
			nil,
		),
		outgoingMessagesGrpcTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "outgoing_messages_grpc_total"),
			"Total number of outgoiing messages via grpc.",
			nil,
			nil,
		),
		fileDownloadsTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "file_downloads_total"),
			"Total number of large file downloads.",
			nil,
			nil,
		),
		fileUploadsTotal: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "file_uploads_total"),
			"Total number of large file uploads.",
			nil,
			nil,
		),
		ctrlCodesTotal2xx: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "ctrl_codes_total_2xx"),
			"Total number of 2xx ctrl response codes.",
			nil,
			nil,
		),
		ctrlCodesTotal3xx: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "ctrl_codes_total_3xx"),
			"Total number of 3xx ctrl response codes.",
			nil,
			nil,
		),
		ctrlCodesTotal4xx: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "ctrl_codes_total_4xx"),
			"Total number of 4xx ctrl response codes.",
			nil,
			nil,
		),
		ctrlCodesTotal5xx: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "ctrl_codes_total_5xx"),
			"Total number of 5xx ctrl response codes.",
			nil,
			nil,
		),
		clusterLeader: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "cluster_leader"),
			"If this cluster node is the cluster leader.",
			nil,
			nil,
		),
		clusterSize: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "cluster_size"),
			"Configured number of cluster nodes.",
			nil,
			nil,
		),
		clusterNodesLive: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "cluster_nodes_live"),
			"Number of cluster nodes believed to be live by the current node.",
			nil,
			nil,
		),
		malloced: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "malloced_bytes"),
			"Number of bytes of memory allocated and in use.",
			nil,
			nil,
		),
		requestLatencyMsCount: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "request_latency_ms_count"),
			"Request latency histogram (in ms).",
			nil,
			nil,
		),
		outgoingMessageBytesCount: prometheus.NewDesc(
			prometheus.BuildFQName(namespace, "", "outgoing_message_bytes"),
			"Response size histogram (in bytes).",
			nil,
			nil,
		),
	}
}