2016-07-10 2 views
1

제 경우에는 influxdb를 사용하고 있습니다. Golang의 글로벌 클라이언트 인 influxdb를 만들려고합니다. 그러나 함수에서 influxdb 클라이언트를 반환하면 클라이언트 객체가 influxdb 패키지로 내보내지지 않습니다. 그래서 나는 이것을 돌려 줄 수 없다.타사 패키지의 내 보낸 개체를 golang의 반환 유형으로 사용하는 방법은 무엇입니까?

package influxclient 

import (
    "github.com/influxdata/influxdb/client/v2" 
    "log" 
    "time" 
    //"net/http" 
    "fmt" 
    "reflect" 
) 

const (
    INFLUXDB_NAME = "XXXX" 
    USERNAME  = "YYYY" 
    PASSWORD  = "ZZZZ" 
    HOST   = "http://localhost:8086" 
) 

var (
    c    = getHTTPClient() 
) 

func test() { 
    // Create a new point batch 
    bp, _ := client.NewBatchPoints(client.BatchPointsConfig{ 
     Database: INFLUXDB_NAME, 
     Precision: "s", 
    }) 

    // Create a point and add to batch 
    tags := map[string]string{"cpu": "cpu-total"} 
    fields := map[string]interface{}{ 
     "idle": 10.1, 
     "system": 53.3, 
     "user": 46.6, 
    } 
    fmt.Println(reflect.TypeOf(c)) 
    pt, _ := client.NewPoint("cpu_usage", tags, fields, time.Now()) 
    bp.AddPoint(pt) 

    // Write the batch 
    c.Write(bp) 
} 

//publish metrics to metrics db 
func PublishMetrics(metricName string, tags map[string]string, fields map[string]interface{}, time time.Time) error { 
    fmt.Println("type of client c ", reflect.TypeOf(c)) 
    // Create a new point batch 
    bp, err := client.NewBatchPoints(client.BatchPointsConfig{ 
     Database: INFLUXDB_NAME, 
     Precision: "s", 
    }) 
    if err != nil { 
     return err 
    } 
    pt, err := client.NewPoint(metricName, tags, fields, time) 
    if err != nil { 
     return err 
    } 
    bp.AddPoint(pt) 
    // Write the batch 
    c.Write(bp) 
    return nil 
} 


func getHTTPClient() *client.client { 
    //make http client for metrics db 
    c, err := client.NewHTTPClient(client.HTTPConfig{ 
     Addr:  HOST, 
     Username: USERNAME, 
     Password: PASSWORD, 
    }) 
    if err != nil { 
     log.Printf("FATAL :: Error occured in getting influxdb metric client %s ", err.Error()) 
    } 
    return c 
} 

getHTTPClient() 기능은 클라이언트 객체 *client.client를 반환하려고 :

여기 내 코드입니다.
그러나 클라이언트 개체는 influxdb golang 패키지에서 내 보내지 않습니다.
그래서이 문제를 어떻게 처리 할 수 ​​있습니까?
아무도 도와 줄 수 있습니까?

감사

+1

을 /client.go#L78,'Client'는 인터페이스 타입으로 export됩니다. 'Client' 유형도 NewHTTPClient''에서 무엇을 반환하는 것입니다 (https://github.com/influxdata/influxdb/blob/master/client/v2/client.go#L95). 다른 유형을 찾고 있습니까? – abhink

+0

그래서 어떤 종류의 오류가 있습니까? –

+0

@SalvadorDali - 소문자 'client'에 대해 다음과 같은 오류가 발생했습니다. '../influxclient/influxclient.go:67 : 내 보낸 이름을 참조 할 수 없습니다. client.client ../influxclient/influxclient.go : 67 : undefined : client.client' – Dany

답변

4

package client // import "github.com/influxdata/influxdb/client/v2"
그렇게 client.Client 대신 *client.client 사용 Client interface을 수출하고있다 : https://github.com/influxdata/influxdb/blob/master/client/v2 당으로

package influxclient 

import (
    "log" 
    "time" 

    "github.com/influxdata/influxdb/client/v2" 
    //"net/http" 
    "fmt" 
    "reflect" 
) 

const (
    INFLUXDB_NAME = "XXXX" 
    USERNAME  = "YYYY" 
    PASSWORD  = "ZZZZ" 
    HOST   = "http://localhost:8086" 
) 

var c = getHTTPClient() 

func test() { 
    // Create a new point batch 
    bp, _ := client.NewBatchPoints(client.BatchPointsConfig{ 
     Database: INFLUXDB_NAME, 
     Precision: "s", 
    }) 

    // Create a point and add to batch 
    tags := map[string]string{"cpu": "cpu-total"} 
    fields := map[string]interface{}{ 
     "idle": 10.1, 
     "system": 53.3, 
     "user": 46.6, 
    } 
    fmt.Println(reflect.TypeOf(c)) 
    pt, _ := client.NewPoint("cpu_usage", tags, fields, time.Now()) 
    bp.AddPoint(pt) 

    // Write the batch 
    c.Write(bp) 
} 

//publish metrics to metrics db 
func PublishMetrics(metricName string, tags map[string]string, fields map[string]interface{}, time time.Time) error { 
    fmt.Println("type of client c ", reflect.TypeOf(c)) 
    // Create a new point batch 
    bp, err := client.NewBatchPoints(client.BatchPointsConfig{ 
     Database: INFLUXDB_NAME, 
     Precision: "s", 
    }) 
    if err != nil { 
     return err 
    } 
    pt, err := client.NewPoint(metricName, tags, fields, time) 
    if err != nil { 
     return err 
    } 
    bp.AddPoint(pt) 
    // Write the batch 
    c.Write(bp) 
    return nil 
} 

func getHTTPClient() client.Client { 
    //make http client for metrics db 
    c, err := client.NewHTTPClient(client.HTTPConfig{ 
     Addr:  HOST, 
     Username: USERNAME, 
     Password: PASSWORD, 
    }) 
    if err != nil { 
     log.Printf("FATAL :: Error occured in getting influxdb metric client %s ", err.Error()) 
    } 
    return c 
} 
+0

답변 해 주셔서 감사합니다. 대문자 클라이언트에 대해 다음 오류가 표시됩니다. '../influxclient/influxclient.go:42 : c.Write 정의 ../influxclient/influxclient.go:62 (타입 * client.Client 인터페이스 인터페이스하지 포인터이다) c.Write 미정 (유형 * 유형으로 C (client.Client 형)를 사용할 수없는 * 리턴 인수 client.Client는 : \t * client.Client는 포인터가 client.Client 는 ../influxclient/influxclient.go:77) 인터페이스 인터페이스 아니하는 포인터 인터페이스가 아닌 인터페이스 ' – Dany

+0

@ dany : client.Client에 대한 포인터를 사용하지 마십시오. 또는 샘플 코드를 복사하십시오. –

+0

아, 알았어요. 그것은 효과가 있었다. 나는 왜 다시'reflect.TypeOf (object)'가'client.Client'라는 포인터를 주 었는지 확실하지 않습니다. 타입이'client.Client'입니다. – Dany